在 Flutter 中从 main() 调用 setState()
Posted
技术标签:
【中文标题】在 Flutter 中从 main() 调用 setState()【英文标题】:Call setState() from main() in Flutter 【发布时间】:2021-02-09 15:48:30 【问题描述】:我在 main() 中调用的每个 Cron-Job 之后如何调用特定 State-Class 的 setState() 方法?
主要():
void main() async
new Cron().schedule(new Schedule.parse('* * * * *'), () async
uploadDocuments();
);
runApp(MaterialApp(
home: MainMenu(),
));
类,我想要调用 setState() 的地方:
class DbObjectsDetails extends StatefulWidget
@override
_DbObjectsDetailsState createState() => _DbObjectsDetailsState();
class _DbObjectsDetailsState extends State<DbObjectsDetails>
void initState()
loadFilesFromDatabase(true);
【问题讨论】:
我不会直接设置状态。您可以设置一个ChangeNotifier,在其上调用一个方法,然后通知听众。在您的 Widget 中,收听它并设置您收到通知时的状态。 或者使用 RiverPod。在那里更新一个值并在它发生变化时重建它是微不足道的。 【参考方案1】:可以尝试使用get_it
包注册GlobalKey
的单例,然后在两个地方都使用
此代码可能有效:
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
GetIt locator = GetIt.instance..allowReassignment = true;
void setupLocator()
locator.registerLazySingleton(() => GlobalKey<DbObjectsDetailsState>());
GlobalKey<DbObjectsDetailsState> newWidgetKey()
locator.registerSingleton(GlobalKey<DbObjectsDetailsState>());
return locator<GlobalKey<DbObjectsDetailsState>>();
void main() async
setupLocator()
new Cron().schedule(new Schedule.parse('* * * * *'), () async
//you can acces the current state of the widget like that:
locator<GlobalKey<DbObjectsDetailsState>>().currentState?.rebuild(););
runApp(MaterialApp(
home: DbObjectsDetails(key: newWidgetKey()),
));
class DbObjectsDetails extends StatefulWidget
DbObjectsDetails(Key key) : super(key: key);
@override
DbObjectsDetailsState createState() => DbObjectsDetailsState();
class DbObjectsDetailsState extends State<DbObjectsDetails>
@override
Widget build(BuildContext context)
throw UnimplementedError();
void rebuild() => setState(())
【讨论】:
【参考方案2】:您只能在有状态小部件中使用状态。主要功能不是小部件,而是飞镖功能。所以没有办法在主函数中使用 setState() 函数。
【讨论】:
以上是关于在 Flutter 中从 main() 调用 setState()的主要内容,如果未能解决你的问题,请参考以下文章
如何在flutter中从streambuilder导航到其他页面?
在 Flutter Web 中从 JS 调用 Dart 方法
调用 if __name__ == '__main__':在一个模块中从另一个模块中的函数 [关闭]