【问题标题】:Using flutter HookWidget and didChangeAppLifecycleState使用颤振 HookWidget 和 didChangeAppLifecycleState
【发布时间】:2020-07-03 01:04:44
【问题描述】:

如何使用 HookWidget 从特定页面监控应用程序的生命周期状态,就像使用 Stateful widget 一样?

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    if (state == AppLifecycleState.paused) {
         ...
    }
    if (state == AppLifecycleState.resumed) {
        ...
    }
    if (state == AppLifecycleState.detached) {
       ...
    }
  }

【问题讨论】:

    标签: flutter flutter-hooks


    【解决方案1】:

    在文档here 中搜索“创建钩子的方法”。您将看到有 2 种创建钩子的方法,使用函数或使用类。您将选择“使用课程”。然后使用 initHook 覆盖作为您的 initState 和 dispose 的工作方式相同。这就是我最终实现它的方式。

    import 'package:flutter/material.dart';
    import 'package:flutter_hooks/flutter_hooks.dart';
    
    useWidgetLifecycleObserver(BuildContext context) {
      return use(const _WidgetObserver());
    }
    
    class _WidgetObserver extends Hook<void> {
      const _WidgetObserver();
    
      @override
      HookState<void, Hook<void>> createState() {
        return _WidgetObserverState();
      }
    }
    
    class _WidgetObserverState extends HookState<void, _WidgetObserver> with WidgetsBindingObserver {
      @override
      void build(BuildContext context) {}
    
      @override
      void initHook() {
        super.initHook();
        WidgetsBinding.instance.addObserver(this);
      }
    
      @override
      void dispose() {
        WidgetsBinding.instance.removeObserver(this);
        super.dispose();
      }
    
      @override
      void didChangeAppLifecycleState(AppLifecycleState state) {
        print("app state now is $state");
        super.didChangeAppLifecycleState(state);
      }
    }
    

    然后

    class Root extends HookWidget {
    
      @override
      Widget build(BuildContext context) {
        useWidgetLifecycleObserver(context);
    

    【讨论】:

    • 有没有办法访问 didChangeAppLifecycleState 中的上下文?我正在使用提供程序,并且想从我公开的服务中调用一个函数。
    【解决方案2】:

    首先创建一个类:

    class MyObserver implements WidgetsBindingObserver {
    }
    

    然后创建它并注册它:

    Widget build(BuildContext) {
      useEffect(() {
        final observer = MyObserver();
        WidgetsBinding.instance.addObserver(observer);
        return () => WidgetsBinding.instance.removeObserver(observer);
      }, const []);
    
      ...
    }
    

    【讨论】:

    • 嘿,只是想知道,我如何才能在我的 didChangeAppLifecycleState 中访问提供程序?由于useProvider,useContext只能从HookWidget的build方法中调用?
    【解决方案3】:

    Flutter hooks 附带一个内置的 didchangeapplifecycle 按如下方式访问它

        final appLifecycleState = useAppLifecycleState();
    
        useEffect(() {
          print("current app state");
          print(appLifecycleState);
          if (appLifecycleState == AppLifecycleState.paused || appLifecycleState == AppLifecycleState.inactive) {
            //...
          } else if (appLifecycleState == AppLifecycleState.resumed) {
            //...
          }
          return null;
        }, [appLifecycleState]);
    

    【讨论】:

    • 如果你只是想要一个回调,你也可以使用useOnAppLifecycleStateChange
    【解决方案4】:

    我刚刚不得不处理同样的问题。这是我使用自定义钩子的解决方案:

        import 'package:flutter/material.dart';
    import 'package:flutter_hooks/flutter_hooks.dart';
    
    AppLifecycleState useAppLifecycleState() {
      return use(const _LifeCycleState());
    }
    
    class _LifeCycleState extends Hook<AppLifecycleState> {
      const _LifeCycleState();
    
      @override
      __LifeCycleState createState() => __LifeCycleState();
    }
    
    class __LifeCycleState extends HookState<AppLifecycleState, _LifeCycleState>
        with WidgetsBindingObserver {
      AppLifecycleState _theState;
    
      @override
      void initHook() {
        super.initHook();
        WidgetsBinding.instance.addObserver(this);
      }
    
      @override
      void didChangeAppLifecycleState(AppLifecycleState state) {
        super.didChangeAppLifecycleState(state);
        setState(() {
          _theState = state;
        });
      }
    
      @override
      AppLifecycleState build(BuildContext context) {
        return _theState;
      }
    
      @override
      void dispose() {
        super.dispose();
        WidgetsBinding.instance.removeObserver(this);
      }
    }
    

    并且在您想要访问应用生命周期状态的HookWidget 中使用 useEffect :

    final appLifecycleState = useAppLifecycleState();
    
    useEffect(() {
      print("current app state");
      print(appLifecycleState);
      if (appLifecycleState == AppLifecycleState.paused ||
          appLifecycleState == AppLifecycleState.inactive) {
        //...
      } else if (appLifecycleState == AppLifecycleState.resumed) {
        //...
      }
      return null;
    }, [appLifecycleState]);
    

    【讨论】:

    • 构建方法不会在真实的 iPhone 设备上调用,因为应用程序在后台。所以我的非活动代码没有被调用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2023-03-30
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    相关资源
    最近更新 更多