在生成小部件之前,使提供程序对象实例处于状态



我有一个statefulwidget,一个用于跟踪多个小部件视图中的数据的自定义FlowState类,一个位于FlowState中并可在这些小部件视图访问的自定义Job模型。

我正在使用Provider获取FlowState实例,并从中获取作业实例。我可以访问小部件构建函数中的FlowState实例,因为我有可用的上下文:

@override
Widget build(BuildContext context) {
Job job = Provider.of<FlowState>(context).job as Job;

但我想避免这种情况,因为我有很多逻辑(例如异步http调用(需要在检索作业时完成,而且这应该只完成一次,而不是每次重建小部件时(调用setState((时(。

因此,我可以在State中的initState((方法中获取FlowState/job,而不是在Widget中获取FlowState/job

class WidgetTest extends StatefulWidget {
const WidgetTest({Key? key}) : super(key: key);
@override
State<WidgetTest> createState() => _WidgetTestState();
}
class _WidgetTestState extends State<WidgetTest> {
Job? job;
@override
void initState() {
Future.delayed(Duration.zero, () {
job = Provider.of<FlowState>(context, listen: false).job as Job;
functionThatUsesJobToGatherOtherData();
});
super.initState();
}
functionThatUsesJobToGatherOtherData() {
print('Gathering data from job properties so it can be used in the widget tree');
setState(() {});
}
@override
Widget build(BuildContext context) {
return Column(children: [
Text('I would like to avoid a null test here: ' + job!.id.toString()),
]);
}
}

这种方法的问题是,我在小部件树中多次使用可为null的作业实例。因为小部件树是在未来返回之前构建的,所以我必须多次检查树中的作业实例是否为空,我希望避免这种情况。我可以用一个空作业初始化作业实例(这会导致其他问题(。或者也许一个FutureBuilder可以工作?-但是,这真的有必要吗,或者对于这类问题有更简单的解决方案吗?

我不确定我是否清楚地理解了你的问题,因此你能在初始化构建方法后获取FlowState吗?

例如:

WidgetsBinding.instance.endOfFrame.then(
(_) async {
// do something
},
);

最新更新