Flutter: Update Widgets On Resume?

后端 未结 6 1531
梦如初夏
梦如初夏 2020-12-01 03:06

In Flutter, is there a way to update widgets when the user leaves the app and come right back to it? My app is time based, and it would be helpful to update the time as soon

相关标签:
6条回答
  • 2020-12-01 03:17

    Using system Channel:

    import 'package:flutter/services.dart';
    
    SystemChannels.lifecycle.setMessageHandler((msg){
      debugPrint('SystemChannels> $msg');
      if(msg==AppLifecycleState.resumed.toString())setState((){});
    });
    

    `

    0 讨论(0)
  • 2020-12-01 03:23

    Here’s an example of how to observe the lifecycle status of the containing activity (Flutter for Android developers):

    import 'package:flutter/widgets.dart';
    
    class LifecycleWatcher extends StatefulWidget {
      @override
      _LifecycleWatcherState createState() => _LifecycleWatcherState();
    }
    
    class _LifecycleWatcherState extends State<LifecycleWatcher> with WidgetsBindingObserver {
      AppLifecycleState _lastLifecycleState;
    
      @override
      void initState() {
        super.initState();
        WidgetsBinding.instance.addObserver(this);
      }
    
      @override
      void dispose() {
        WidgetsBinding.instance.removeObserver(this);
        super.dispose();
      }
    
      @override
      void didChangeAppLifecycleState(AppLifecycleState state) {
        setState(() {
          _lastLifecycleState = state;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        if (_lastLifecycleState == null)
          return Text('This widget has not observed any lifecycle changes.', textDirection: TextDirection.ltr);
    
        return Text('The most recent lifecycle state this widget observed was: $_lastLifecycleState.',
            textDirection: TextDirection.ltr);
      }
    }
    
    void main() {
      runApp(Center(child: LifecycleWatcher()));
    }
    
    0 讨论(0)
  • 2020-12-01 03:25

    Simple way:

    import 'package:flutter/services.dart';
    
    handleAppLifecycleState() {
        AppLifecycleState _lastLifecyleState;
        SystemChannels.lifecycle.setMessageHandler((msg) {
    
         print('SystemChannels> $msg');
    
            switch (msg) {
              case "AppLifecycleState.paused":
                _lastLifecyleState = AppLifecycleState.paused;
                break;
              case "AppLifecycleState.inactive":
                _lastLifecyleState = AppLifecycleState.inactive;
                break;
              case "AppLifecycleState.resumed":
                _lastLifecyleState = AppLifecycleState.resumed;
                break;
              case "AppLifecycleState.suspending":
                _lastLifecyleState = AppLifecycleState.suspending;
                break;
              default:
            }
        });
      }
    

    just add handleAppLifecycleState() in your init()

    OR

    class AppLifecycleReactor extends StatefulWidget {
          const AppLifecycleReactor({ Key key }) : super(key: key);
    
          @override
          _AppLifecycleReactorState createState() => _AppLifecycleReactorState();
        }
    
        class _AppLifecycleReactorState extends State<AppLifecycleReactor> with WidgetsBindingObserver {
          @override
          void initState() {
            super.initState();
            WidgetsBinding.instance.addObserver(this);
          }
    
          @override
          void dispose() {
            WidgetsBinding.instance.removeObserver(this);
            super.dispose();
          }
    
          AppLifecycleState _notification;
    
          @override
          void didChangeAppLifecycleState(AppLifecycleState state) {
            setState(() { _notification = state; });
          }
    
          @override
          Widget build(BuildContext context) {
            return Text('Last notification: $_notification');
          }
        }
    

    For more details you refer documentation

    0 讨论(0)
  • 2020-12-01 03:27
    import 'package:flutter/material.dart';
    
    abstract class LifecycleWatcherState<T extends StatefulWidget> extends State<T>
        with WidgetsBindingObserver {
      @override
      Widget build(BuildContext context) {
        return null;
      }
    
      @override
      void initState() {
        super.initState();
        WidgetsBinding.instance.addObserver(this);
      }
    
      @override
      void dispose() {
        WidgetsBinding.instance.removeObserver(this);
        super.dispose();
      }
    
      @override
      void didChangeAppLifecycleState(AppLifecycleState state) {
        switch (state) {
          case AppLifecycleState.resumed:
            onResumed();
            break;
          case AppLifecycleState.inactive:
            onPaused();
            break;
          case AppLifecycleState.paused:
            onInactive();
            break;
          case AppLifecycleState.detached:
            onDetached();
            break;
        }
      }
    
      void onResumed();
      void onPaused();
      void onInactive();
      void onDetached();
    }
    

    Example

    class ExampleStatefulWidget extends StatefulWidget {
      @override
      _ExampleStatefulWidgetState createState() => _ExampleStatefulWidgetState();
    }
    
    class _ExampleStatefulWidgetState
        extends LifecycleWatcherState<ExampleStatefulWidget> {
      @override
      Widget build(BuildContext context) {
        return Container();
      }
    
      @override
      void onDetached() {
    
      }
    
      @override
      void onInactive() {
    
      }
    
      @override
      void onPaused() {
    
      }
    
      @override
      void onResumed() {
    
      }
    }
    
    0 讨论(0)
  • 2020-12-01 03:31

    You can listen to lifecycle events by doing this for example :

    import 'package:flutter/material.dart';
    import 'package:flutter/foundation.dart';
    
    class LifecycleEventHandler extends WidgetsBindingObserver {
      final AsyncCallback resumeCallBack;
      final AsyncCallback suspendingCallBack;
    
      LifecycleEventHandler({
        this.resumeCallBack,
        this.suspendingCallBack,
      });
    
      @override
      Future<void> didChangeAppLifecycleState(AppLifecycleState state) async {
        switch (state) {
          case AppLifecycleState.resumed:
            if (resumeCallBack != null) {
              await resumeCallBack();
            }
            break;
          case AppLifecycleState.inactive:
          case AppLifecycleState.paused:
          case AppLifecycleState.detached:
            if (suspendingCallBack != null) {
              await suspendingCallBack();
            }
            break;
        }
      }
    }
    
    
    
    class AppWidgetState extends State<AppWidget> {
      void initState() {
        super.initState();
    
        WidgetsBinding.instance.addObserver(
          LifecycleEventHandler(resumeCallBack: () async => setState(() {
            // do something
          }))
        );
      }
      ...
    }
    
    0 讨论(0)
  • 2020-12-01 03:34

    For deeply testing, I think the results are worth for read. If you are curious about which method you should use, just read the below: (Tested on Android)

    There are three methods for LifeCycle solution.

    1. WidgetsBindingObserver
    2. SystemChannels.lifecycle
    3. flutter-android-lifecycle-plugin

    The main difference between WidgetsBindingObserver and SystemChannels.lifecycle is that WidgetsBindingObserver have more capables If you have a bunch of widgets that need to listen LifeCycle. SystemChannels is more low layer, and used by WidgetsBindingObserver.

    After several testing, If you use SystemChannels after runApp, and home widget mixin with WidgetsBindingObserver, home widget would be failed, because SystemChannels.lifecycle.setMessageHandler override the home's method.

    So If you want to use a global, single method, go for SystemChannels.lifecycle, others for WidgetsBindingObserver.

    And what about the third method? This is only for Android, and If you must bind your method before runApp, this is the only way to go.

    0 讨论(0)
提交回复
热议问题