Skip to content

The WidgetRef.invalidate method should not depend on ProviderScope #4388

@BreX900

Description

@BreX900

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 request

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions