首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在构建小部件之前获取提供程序对象实例的状态

在构建小部件之前获取提供程序对象实例的状态
EN

Stack Overflow用户
提问于 2022-10-04 19:08:06
回答 1查看 79关注 0票数 0

我有一个状态小部件,一个用于跟踪多个小部件视图中数据的自定义FlowState类,这是一个存在于FlowState中并在这些小部件视图中被访问的自定义作业模型。

我使用提供程序来获取FlowState实例,然后从那里获取作业实例。我可以访问小部件构建函数中的FlowState实例,因为我有可用的上下文:

代码语言:javascript
复制
@override
Widget build(BuildContext context) {
Job job = Provider.of<FlowState>(context).job as Job;

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

因此,与其在Widget中获取FlowState/job,我可以在状态中的initState()方法中使用“可悲”的未来攻击:

代码语言:javascript
复制
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可以工作吗?-但是这真的是必要的吗?还是有一个更简单的解决方案来解决这类问题?

EN

回答 1

Stack Overflow用户

发布于 2022-10-05 00:33:15

我不确定我是否对您的问题有一个清晰的理解,因此,您能在初始化构建方法no之后获取FlowState吗?

例如:

代码语言:javascript
复制
WidgetsBinding.instance.endOfFrame.then(
      (_) async {
        // do something
      },
    );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73952563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档