-
Notifications
You must be signed in to change notification settings - Fork 258
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: webassembly #982
base: master
Are you sure you want to change the base?
fix: webassembly #982
Conversation
Change named params to positional params in order to work with wasm
@davidsdearaujo In the example of creating common Binds, it worked. And this problem does not occur when we have WASM disabled. Below is the example with an import of another class and the printscreen of the error. import 'package:flutter/material.dart';
import 'package:flutter_modular/flutter_modular.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
runApp(ModularApp(
module: AppModule(),
child: const MyApp(),
));
}
class DioFake {
DioFake();
}
class ChangeNotifierTest extends ChangeNotifier {
int value = 0;
final DioFake dioFake;
ChangeNotifierTest({required this.dioFake});
void increment() {
value++;
notifyListeners();
}
}
class AppModule extends Module {
@override
void binds(i) {
i.addSingleton(DioFake.new);
i.addInstance(ChangeNotifierTest.new);
}
@override
void routes(RouteManager r) {
r.child("/", child: (context) => const MyHomePage(title: 'Flutter Demo Home Page'));
}
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp.router(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
routerConfig: Modular.routerConfig,
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
ChangeNotifierTest test = Modular.get();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
ListenableBuilder(
listenable: test,
builder: (context, _) {
return Text(
test.value.toString(),
style: Theme.of(context).textTheme.headlineMedium,
);
}),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: test.increment,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
} |
As I explained in the PR description, by some reason dart is not working correctly when we try to infer named params to use
In your case it would look like this: class AppModule extends Module {
@override
void binds(i) {
i.addSingleton(DioFake.new);
i.addInstance(() => ChangeNotifierTest(dioFake: i()));
}
@override
void routes(RouteManager r) {
r.child("/", child: (context) => const MyHomePage(title: 'Flutter Demo Home Page'));
}
} Another way to avoid that problem is to change the way your class receive parameters, you can use positional params instead of named params. In this example you only need to change the constructor class ChangeNotifierTest extends ChangeNotifier {
int value = 0;
final DioFake dioFake;
ChangeNotifierTest(this.dioFake);
void increment() {
value++;
notifyListeners();
}
}
class AppModule extends Module {
@override
void binds(i) {
i.addSingleton(DioFake.new);
i.addInstance(ChangeNotifierTest.new);
}
@override
void routes(RouteManager r) {
r.child("/", child: (context) => const MyHomePage(title: 'Flutter Demo Home Page'));
}
} |
Problem
When you run an empty project in WASM using flutter_modular it breaks.
Solution
I believe this issue will be resolved in the Flutter engine itself in the future. It’s likely specific to WASM compilation, as it doesn’t occur on other platforms. Looks like some named params are not working well in WASM, so I recommend to use constructors with positional params of named params.
The injections causing the error in an empty project are internal to flutter_modular. I managed to resolve it by changing the constructors params from positional to named (see the changed files).
For developers
If you want to use named params and you are receiving this error you need to register your dependency like that (only for the dependencies that are returning error in the browser console):
🚫 Before (does not work on WASM)
✅ After (Works on WASM)
When we have it fixed (in Flutter side or in the auto_injector package) this workaround will not be needed anymore.
Checklist
fix:
,feat:
,docs:
etc).docs
and added dartdoc comments with///
.examples
.Breaking Change
Related Issues