我有一个状态小部件,一个用于跟踪多个小部件视图中数据的自定义FlowState类,这是一个存在于FlowState中并在这些小部件视图中被访问的自定义作业模型。
我使用提供程序来获取FlowState实例,然后从那里获取作业实例。我可以访问小部件构建函数中的FlowState实例,因为我有可用的上下文:
@override
Widget build(BuildContext context) {
Job job = Provider.of<FlowState>(context).job as Job;但是我想避免这种情况,因为我有很多逻辑(例如异步http调用),在检索作业时需要完成,而且应该只执行一次,而不是每次重新构建小部件时(当调用setState()时)。
因此,与其在Widget中获取FlowState/job,我可以在状态中的initState()方法中使用“可悲”的未来攻击:
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可以工作吗?-但是这真的是必要的吗?还是有一个更简单的解决方案来解决这类问题?
发布于 2022-10-05 00:33:15
我不确定我是否对您的问题有一个清晰的理解,因此,您能在初始化构建方法no之后获取FlowState吗?
例如:
WidgetsBinding.instance.endOfFrame.then(
(_) async {
// do something
},
);https://stackoverflow.com/questions/73952563
复制相似问题