在小部件构建完成之前运行方法?
Posted
技术标签:
【中文标题】在小部件构建完成之前运行方法?【英文标题】:Run a method before the widget build complete? 【发布时间】:2021-05-09 00:07:27 【问题描述】:我想知道是否有任何方法可以仅在应用程序启动时调用函数,但在构建小部件之前。我只想在应用程序启动时从 JSON 中获取数据。但是方法在提供者中并且需要上下文。
我尝试了几种方法,但没有什么是完美的。我在 HomeScreen() 的 initState 上调用了该函数,但仍需要刷新应用程序才能看到。 (因为该方法是在布局构建后调用的..所以没有加载任何项目)
void initState()
super.initState();
Provider.of<Utils>(context, listen: false)
.fetchDataFromJSON()
.then((value)
setState(() );
);
仍然需要刷新或更改页面来加载项目。我在 tabScreen.dart 中执行此 initState。显然,在 HomeScreen 上创建元素所需的数据但第一次没有加载。
编辑:我通过更改调用函数的位置来修复它。我的错误是我从 TabScreen 的 InitState 中调用了初始状态。我将其更改为 HomeScreen 的 InitState,它运行良好。希望我的错误对其他人有所帮助。
【问题讨论】:
在获取后调用notifyListeners()
,因为函数在Provider
中。或者在initState
你可以做fetchData().then( (_) => setState(() ) );
【参考方案1】:
方法一(不确定) 您可以在 main 方法中使用您的方法,然后运行应用程序。
但如果这会导致 lateInit 错误,我现在不会。
void main()
someFunction.then((value)
runApp(MyApp);
)
方法二
创建布尔变量,如 loaded
将其设置为 false
然后使用三元运算符分配您的小部件需要的数据。
如果loaded
为假,则加载另一个小部件而不是需要数据的小部件
函数完成后在 initState 中使用函数,将 loaded
设置为 true
【讨论】:
我已经尝试过了,所以我们只能运行一次获取代码。但问题是获取工作正常,但我需要刷新或更改页面以显示数据。我不知道为什么。运行应用程序之前的代码是无助的,因为我需要上下文因为使用 Provider。以上是关于在小部件构建完成之前运行方法?的主要内容,如果未能解决你的问题,请参考以下文章
jQuery UI - 我啥时候应该在小部件上使用 destroy 方法
ValueNotifier:在页面构建完成之前更新小部件的文本引发异常
ScaffoldMessenger.of(context).showSnackBar() 在小部件构建函数中直接调用时不起作用