I got this error:
‘ChangeNotifierProvider’ isn’t a function. Try correcting the name to
match an existing function, or define a method or function named
‘ChangeNotifierProvider’
I’m looking to migrate provider to Riverpod, but it is difficult for me to do that
This is my code:
void main() async {
await Hive.initFlutter();
await Hive.openBox("Habit_Database");
runApp(MultiProvider(providers: [
ChangeNotifierProvider(
create: (context) => UserProvider(),
),
], child: const MyApp()));
}
How can I solve this issue?
Thanks for any help you can provide
2
Answers
I’m working on this right now for a client. I have chosen to maintain the existing provider infrastructure while slowly migrating one provider at a time to riverpod.
To make this work, I first constructed a renaming shim for all of the exported provider functions. It imports provider, and establishes typedefs to alias those names to universally end in "X", including the extension on BlockContext which becomes .readX and .selectX. I tested this by not having the "X" initially, then renaming each symbol in VSC one at a time, which surprisingly worked well. The renaming shim looks something like:
which continues for about 100 lines. The tricky ones are the extensions:
Admittedly, once I started the pattern, Github copilot eagerly offered me line after line, and was wrong for only a few things initially.
Next, I added the RiverPod ProviderScope to my runApp, and selected a particular provider to migrate. I created the equivalent in RiverPod, nicely namespaced because "FooProvider" became "fooProvider", and then located all references to that class in .readX or ConsumerX access. I inserted the equivalent with Consumer blocks or ConsumerWidget widgets, giving me a ref to use with ref.read or ref.watch as appropriate.
It’s not trivial. But once you get over "the great rename" hurdle, the rest is just a rather mechanical translation, and can be done incrementally.
The error message is indicating that
ChangeNotifierProvider
isn’t a function. You are trying to migrate fromprovider
toRiverpod.
In Riverpod, the equivalent class for
ChangeNotifierProvider
isChangeNotifierProvider.autoDispose.
So you should replace this line:
with this line:
This should solve the issue.