-
-
Notifications
You must be signed in to change notification settings - Fork 1k
Open
Labels
enhancementNew feature or requestNew feature or request
Description
The problem I am trying to solve is to be able to invalidate all providers used by a widget (on a screen) in order to have updated data when opening a screen.
For example:
final _provider = FutureProvider((ref) async {
return 1;
});
class HomeScreen extends ConsumerStatefulWidget {
const HomeScreen({super.key});
@override
ConsumerState<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends ConsumerState<HomeScreen> {
@override
void initState() {
super.initState();
// This line of code throws an exception
// dependOnInheritedWidgetOfExactType<_UncontrolledProviderScope>() or dependOnInheritedElement() was called before _HomeScreenState.initState() completed.
ref.invalidate(_provider);
ref.listenManual(_provider, (prev, next) {
print('$next');
});
}
@override
Widget build(BuildContext context) {
final value = ref.watch(_provider);
return Scaffold(body: Text('$value'));
}
}The solution could be that the WidgetRef.invalidate method does not depend on _UncontrolledProviderScope but only reads its value as for the WidgetRef.refresh method.
Then the WidgetRef code would become:
base class ConsumerStatefulElement extends StatefulElement
implements WidgetRef {
@override
void invalidate(ProviderOrFamily provider, {bool asReload = false}) {
_assertNotDisposed();
ProviderScope.containerOf(this, listen: false).invalidate(provider, asReload: asReload);
}
}I also thought about using State.didChangeDependencies, but it would complicate the code quite a bit, and I would also have to move ref.listenManual or other code
Furthermore, it is not clear to me why I have to depend on ProviderScope in order to call WidgetRef.invalidate
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request