flutter - 颤振根小部件是否应该始终是 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(),
},
);
}
}
- 因为我认为有时需要调用 init 函数,并且可能不希望将代码写入
HomePage
. 例如:检查token是否过期,决定去HomePage
或LoginPage
。 initState
那么最好的选择:我应该将根 Widget 更改为 StatefulWidget,并在其函数中包含上述逻辑吗?
解决方案
在侦听(例如恢复 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(),
推荐阅读
- javascript - 使用 Vue 将新子项添加到实时 Firebase 数据库
- c++ - 如何给曼德布洛上色?
- c# - 在 Inspector (Unity) 中显示数组
- ruby - 如果用户在 Ruby 中按任意键,如何终止循环?
- ios - 如何从 DynamoDB 表中删除项目?(迅速)
- wordpress - 如何通过登录注册表限制WordPress网站中的特定页面?
- python - Jinja 迭代字典
- bash - 参数中带有“::”特殊字符的 Bash-Completion 不起作用
- python - AttributeError 问题:模块“selenium.webdriver”没有属性“Chrome”
- sql - 基于属性出现的 SQL 过滤器组