Search code examples
flutterdartriverpod

Flutter WidgetsBindingObserver call Riverpod Provider


I am currently working on a Flutter app. Here, when the lifecycle state of the app changes to resumed, I need to set a value in a Riverpod provider to update the state of the page. however, I can't call a provider in the didChangeAppLifecycleState method. how can I still solve my problem?

The code I have tried for this looks like this: (i called the value i want to set "something"

final homePageProvider = ChangeNotifierProvider((ref) => HomePageState());

class HomePageState extends ChangeNotifier {
bool _something = false

  bool get something => _isEmailVerified;

  void setSomething(bool value) {
    _something = value;
    notifyListeners();
  }
}

class NewHome extends ConsumerWidget with WidgetsBindingObserver{

@override
  Widget build(BuildContext context, WidgetRef ref) {
WidgetsBinding.instance.addObserver(this);

... //other code for the ui
}

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) async {
    switch (state) {
      case AppLifecycleState.resumed:
        if(condition == false) {
            ref.read(homePageProvider).setSomething(true);
        }
        break;
      case AppLifecycleState.paused:
        break;
      case AppLifecycleState.detached:
        break;
      case AppLifecycleState.inactive:
        break;
      case AppLifecycleState.hidden:
        break;
    }
  }

}

Solution

  • It seems like your widget should be a widget with a state

    Plus, you can use the new AppLifecycleListener and then access ref wherever you need it:

    class AppLifecyclePage extends ConsumerStatefulWidget {
      const AppLifecyclePage({super.key});
    
      @override
      State<AppLifecyclePage> createState() => _AppLifecyclePageState();
    }
    
    class _AppLifecyclePageState extends State<AppLifecyclePage> {
      late final AppLifecycleListener _listener;
    
      @override
      void initState() {
        super.initState();
    
        _listener = AppLifecycleListener(
          onStateChange: _onStateChanged,
        );
      }
    
      @override
      void dispose() {
        _listener.dispose();
    
        super.dispose();
      }
    
      void _onStateChanged(AppLifecycleState state) {
        switch (state) {
          case AppLifecycleState.resumed:
            _onResumed();
        }
      }
    
      void _onResumed() {
        if(condition == false) {
          ref.read(homePageProvider).setSomething(true);
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return const Scaffold(
          body: Placeholder(),
        );
      }
    }