AppLifcycleState.didChangeLifecycleState() 函数在应用程序进入前台或后台时不会被调用

pra*_*n r 7 dart flutter

当我打开我的应用程序或在后台运行时,不会调用 didChangeAppLifecycleState() 并且不会执行打印语句。

   import 'package:flutter/widgets.dart';
   import 'package:flutter/material.dart';


   void main(){
    runApp(
    MaterialApp(
      home: Home(),
    )
   );
   }


   class Home extends StatefulWidget {
   @override
    _HomeState createState() => _HomeState();
   }

   class _HomeState extends State<Home> with WidgetsBindingObserver{
   AppLifecycleState state;
   @override
   void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
   }
  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  void didChangeAppLifeCycleState(AppLifecycleState appLifecycleState) {
    state = appLifecycleState;
    print(appLifecycleState);
    print(":::::::");
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: Center(
          child:Text("hi")
        ),
      ),
    );
  }
}
}
Run Code Online (Sandbox Code Playgroud)

didChangeAppLifeCycleState() 中的打印语句未执行。

Phu*_*ran 36

有一个拼写错误(“Lifecycle”中的小写“c”),应该是 didChangeAppLifecycleState:

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
   state = state;
   print(state);
   print(":::::::");
}
Run Code Online (Sandbox Code Playgroud)

更新:不要忘记在 initState() 中添加观察者并在 dispose() 中删除观察者

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

// ...

@override
void dispose() {
  WidgetsBinding.instance!.removeObserver(this);
  super.dispose();
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!

  • 但这并不是真正解决OP问题的方法,不是吗?我认为 IDE 现在已经很常见了:-)) (3认同)

use*_*019 18

这不是 OP 问题的答案,每次我遇到这个问题时,我都忘记打电话WidgetsBinding.instance.addObserver(this);initState()

如果didChangeAppLifecycleState没有为您调用,请不要忘记将您的实现类添加为侦听器。

initState()和 中查看 OP 的代码,并dispose()确保您也这样做。


Say*_*yka 16

我必须将问题中的代码与上述两个答案结合起来才能得到最终结果。因此,让我添加一个简单的示例来说明如何正确使用 AppLifeCycleState。

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
   @override
   _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
  
  @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:
        // --
        print('Resumed');
        break;
      case AppLifecycleState.inactive:
        // --
        print('Inactive');
        break;
      case AppLifecycleState.paused:
        // --
        print('Paused');
        break;
      case AppLifecycleState.detached:
        // --
        print('Detached');
        break;
      case AppLifecycleState.hidden:
        // A new **hidden** state has been introduced in latest flutter version
        print('Hidden');
        break;
    }
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }

}
Run Code Online (Sandbox Code Playgroud)