Chris
Chris

Reputation: 165

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;
    }
  }

}

Upvotes: 2

Views: 489

Answers (1)

Ruble
Ruble

Reputation: 4844

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(),
    );
  }
}

Upvotes: 3

Related Questions