相关疑难解决方法(0)

颤动:如何正确使用继承的小部件?

使用InheritedWidget的正确方法是什么?到目前为止,我明白它让你有机会沿着Widget树传播数据.在极端情况下,如果你把它作为RootWidget,它将可以从所有Routes树中的所有Widgets访问,这很好,因为不知何故我必须使我的ViewModel/Model可以访问我的Widgets而不必诉诸于全局或Singletons.

但是InheritedWidget是不可变的,那么如何更新呢?更重要的是我的状态窗口小部件如何触发重建他们的子树?

不幸的是,文档在这里非常不清楚,经过大量讨论后,似乎没有人真正知道使用它的正确方法.

我添加了Brian Egan的一句话:

是的,我认为这是一种沿树传播数据的方法.从API文档中我发现令人困惑的是:

"以这种方式引用时,继承的小部件将导致使用者在继承的小部件本身更改状态时重建."

当我第一次阅读本文时,我想:

我可以在InheritedWidget中填充一些数据并稍后进行修改.当发生突变时,它将重建引用我的InheritedWidget的所有Widgets我发现的内容:

为了改变InheritedWidget的状态,你需要将它包装在StatefulWidget中然后实际上改变StatefulWidget的状态并将这些数据传递给InheritedWidget,后者将数据传递给它的所有子节点.但是,在这种情况下,它似乎重建了StatefulWidget下面的整个树,而不仅仅是引用InheritedWidget的Widgets.那是对的吗?或者它会以某种方式知道如果updateShouldNotify返回false,如何跳过引用InheritedWidget的Widgets?

dart flutter

74
推荐指数
3
解决办法
2万
查看次数

Flutter - InheritedWidget - dispose

我想知道是否有人知道何时处理一个InheritedWidget?

这个问题的原因是我正在做一些实验,我使用的是InheritedWidget作为BLoC的提供者.此BLoC在InheritedWidget级别初始化,并使用StreamController.

由于建议关闭StreamController,我试图找到一个解决方案.

这是一段代码(仅用于实验的愚蠢代码)来说明问题:

///
/// ApplicationProvider
/// 
/// A provider of ApplicationBloc
/// 
class ApplicationProvider extends InheritedWidget {
  //
  // Initialization of the BLoC
  //
  final ApplicationBloc bloc = new ApplicationBloc();

  ApplicationProvider({Key key, Widget child}) : super(key: key, child: child);

  @override
  bool updateShouldNotify(_) => true;

  static ApplicationBloc of(BuildContext context, [bool redraw = true]) {
    return redraw ? (context.inheritFromWidgetOfExactType(ApplicationProvider) as ApplicationProvider).bloc
                  : (context.ancestorWidgetOfExactType(ApplicationProvider) as ApplicationProvider).bloc;
  }
}

//
// The BLoC
//   
class ApplicationBloc {

  int _counter;
  StreamController<int> _counterController = …
Run Code Online (Sandbox Code Playgroud)

flutter

6
推荐指数
1
解决办法
6196
查看次数

标签 统计

flutter ×2

dart ×1