【问题标题】:Future builder - Need Build Context Prior未来的建设者 - 需要先构建上下文
【发布时间】:2020-03-28 10:19:41
【问题描述】:

我的 addSteps 函数需要访问上下文。我有一个存储在此处的存储库对象。

 Future<int> _addSteps() async {
     repository = RepositoryProvider.of<lo.Repository>(context);
     ...
 }

未来_addStepsFuture 是在didChangeDependencies 中创建的。

didChangeDependencies() {
     addStepsFuture = _addSteps();
}

虽然在 Build 调用中稍后会收到上下文。

FutureBuilder<int>(
          future: _addStepsFuture,
)

在调用Build 之前,BuildContext 不可用。

有没有办法解决这个问题?谢谢你。

【问题讨论】:

  • 您能添加更多示例代码吗?你到底想用BuildContext 做什么? context 应该在 didChangeDependencies 中可用。看到这个SO answer
  • 我在上面添加了更多代码。

标签: flutter dart future builder


【解决方案1】:

您可以在 didChangeDependencies 中访问 context,因为您的 RepositoryProvider.of 调用只是在后台使用 inheritFromWidgetOfExactType

但除非您有其他原因使用 didChangeDependencies 生命周期挂钩,否则您也可以尝试:

class Foo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final repository = RepositoryProvider.of<lo.Repository>(context);

    return FutureBuilder(
      future: _addSteps(repository),
      builder: (context, snapshot) {
        return Placeholder();
      },
    );
  }

  Future _addSteps(lo.Repository repository) async {
    /* ... */
  }
}

class Foo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: _addSteps(context),
      builder: (context, snapshot) {
        return Placeholder();
      },
    );
  }

  Future _addSteps(BuildContext context) async {
    final repository = RepositoryProvider.of<lo.Repository>(context);
    /* ... */
  }
}

如果我误解了问题,请告诉我

【讨论】:

  • 不建议这样做 -> 未来:_addSteps(repository)。官方的说明是 -> 未来必须更早获得,例如在 State.initState、State.didUpdateConfig 或 State.didChangeDependencies 期间。 -> api.flutter.dev/flutter/widgets/FutureBuilder-class.html
  • 我明白了。在这种情况下,您的初始代码看起来是正确的,不是吗?它抛出了一个错误吗? RepositoryProvider 只需调用不需要特殊上下文的Provider package's Provider.of&lt;Foo&gt;(context, listen: false)(即它不需要传递给build 的上下文),只要您在上面的某处提供了存储库
猜你喜欢
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多