首页 > 解决方案 > 颤振根小部件是否应该始终是 StatelessWidget?

问题描述

当我在flutter中阅读文档时,我有一个问题应该flutter root widget始终是StatelessWidget?

 class MyApp extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     return MaterialApp(
       title: 'Flutter Code Sample for Navigator',
       // MaterialApp contains our top-level Navigator
       initialRoute: '/',
       routes: {
         '/': (BuildContext context) => HomePage(),
         '/signup': (BuildContext context) => SignUpPage(),
       },
     );
   }
 }
  1. 因为我认为有时需要调用 init 函数,并且可能不希望将代码写入HomePage. 例如:检查token是否过期,决定去HomePageLoginPage
  2. initState那么最好的选择:我应该将根 Widget 更改为 StatefulWidget,并在其函数中包含上述逻辑吗?

标签: flutter

解决方案


在侦听(例如恢复 WebSocket 连接之类的恢复工作)时,使根小部件变为StatefulWidget有用AppLifecycleState

代码片段

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

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {

  AppLifecycleState _lastLifecycleState;


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

  }

  initPlatformState() async {
    Screen.keepOn(true);   
  }

  Future<void> resumeCallBack() {
    if (sl<WebSocketService>().webSocketState == 'lost') {
      sl<WebSocketService>().initWebSocket();
    }

    if (mounted) {
      setState(() {});
    }
    print("resumeCallBack");
  }

  Future<void> suspendingCallBack() {
    if (mounted) {
      setState(() {});
    }
    print("suspendingCallBack");
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) async {
    super.didChangeAppLifecycleState(state);
    print("AppLifecycleState Current state = $state");
    setState(() {
      _lastLifecycleState = state;
    });

    switch (state) {
      case AppLifecycleState.inactive:
      case AppLifecycleState.paused:
      case AppLifecycleState.detached:
      /*case AppLifecycleState.suspending:
        await suspendingCallBack();
        break;*/
      case AppLifecycleState.resumed:
        await resumeCallBack();
        break;
    }
  }

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Template',
      debugShowCheckedModeBanner: false,
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      initialRoute: '/',
      routes: {
        '/': (context) => LoginPage(),

推荐阅读