Category: Flutter

Fun with Flutter

Fun with Flutter

So I upgraded Flutter to 3.35 and tried building an app for the Web. It failed with a weird error about the js package being deprecated. Errors a bit like this:

Target dart2js failed: ProcessException: Process exited abnormally with exit code 1:
Error: Couldn’t resolve the package ‘libphonenumber_web’ in ‘package:libphonenumber_web/libphonenumber_web.dart’.
.dart_tool/flutter_build/6872c759b3585597f59b4a698a13ca94/web_plugin_registrant.dart:9:8:
Error: Not found: ‘package:libphonenumber_web/libphonenumber_web.dart’
import ‘package:libphonenumber_web/libphonenumber_web.dart’;

I’d been experimenting with flutter_login package and it was in the projects pubspec.yaml.  I found this out by using this command:

flutter pub deps

Which provides a full and detailed tree of all package dependencies. Like this but 260 lines in total!

turfwar 1.0.0+1
|– badges 3.1.2
| ‘– flutter…
|– cupertino_icons 1.0.8
|– flutter 0.0.0
| |– characters 1.4.0
| |– collection 1.19.1
| |– material_color_utilities 0.11.1
| | ‘– collection…
| |– meta 1.16.0
| |– sky_engine 0.0.0
| ‘– vector_math 2.2.0
|– flutter_lints 6.0.0
| ‘– lints 6.0.0
|– flutter_test 0.0.0

js was used by libphonenumber which was part of flutter_login.  However despite removing that from pubspec.yaml and removing the package files, the flutter build web command was still complaining about it.

The trick to solving that is just to delete the .dart_tool folder. It’s regenerated by the flutter build command so is safe to delete.

Flutter project screenshot

There’s a new feature now, you can add –wasm on the end of the flutter build web command to have it use wasm. More on this official flutter wasm page which includes a link to a neat demo project called wonderous that is worth a look; the source to that is available on GitHub as well..

Don’t get Flutter and Dart mixed up

Don’t get Flutter and Dart mixed up

A bird a Flutter and Darts

I’m working on a game with a Flutter web client and two Dart terminal programs hence the visual pun. Annoyingly, you can’t compile a Dart exe for Linux on a Windows PC. You can do that in C# but I prefer to use Dart.

I have all the classes in two files (one is called classes.dart) and because I’m using JSON to persist game data, I use the build_runner package from pub.dev. Just add this before any classes:

@JsonSerializable()

Make sure if you have enums that every enum value has

@JsonValue('houses')

before it and add functions like this for each class you want to persist; in this case a Location class:

factory Location.fromJson(Map<String, dynamic> json) =>
    _$LocationFromJson(json);

Map<String, dynamic> toJson() => _$LocationToJson(this);

Then when it’s all done, do this to generate a file that handles loading and saving the specified classes.

dart run build_runner build

Along the way though I managed to get Flutter into a Dart program. I’m using SQLite but only in Dart, not in the Flutter app. Unfortunately I used the kIsWeb constant to exclude some calls (when the classes are used by the Flutter app) in my classes file.  But you can’t do that in a pure Dart program, it will not compile. Instead I wrote my own function.

bool isWeb() {
  return !Platform.isWindows && !Platform.isLinux;
}

Interestingly, the definition of kIsWeb in the API is this below, so it might be worth trying that out.

const bool kIsWeb = bool.fromEnvironment(‘dart.library.js_util’);