在“ componentDidMount”上更新ChangeNotifierProvider的值

时间:2019-09-02 01:15:49

标签: flutter

我正在使用Provider在小部件层次结构中传递值。在一种情况下,必须在绘制小部件之前,绘制小部件时或什至在绘制小部件之后,立即从后代小部件中更新值,这类似于React的componentDidMount生命周期挂钩。

这可能吗?似乎您需要BuildContext对象,该对象似乎仅在小部件的build方法内部可用。

为了展示这个问题,我有以下代码示例(请注意:它会引发异常):

  Widget build(BuildContext context) {
    var attrs = Provider.of<SelectedPageAttributes>(context);
    attrs.updateSelectedPageAttributes(title, color);

    return CupertinoPageScaffold(
        resizeToAvoidBottomInset: true,
        navigationBar: CupertinoNavigationBar(
            backgroundColor: Colors.black,
            middle: attrs.title != null
                ? Text(attrs.title, style: categoryPageTitle)
                : null),
        child: Container(
            child: SafeArea(child: child),
            )));
  }

本质上,我试图在返回小部件之前对其进行更新。这理所当然地抱怨在构建过程中正在调用setState(),但是我不知道该在哪里调用它。我可以使用任何生命周期挂钩吗?

请注意,我知道可以使用Provider<T>向下游发送数据,但这似乎很不方便,因为每当有新的页面路由时都必须重新应用它,而在使用ChangeNotifierProvider时可以避免这种情况它包装了应用程序。

1 个答案:

答案 0 :(得分:0)

Flutter中没有componentDidMount

您最好的选择是使用initState并安排在框架结束后执行的回调:

initState() {
  super.initState();
  Future.microtask(() {
    Provider.of<Foo>(context).doSomething();
  });
}