使用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?
我试图理解在Widgets State之外控制StatefulWidget状态的最佳实践.
我定义了以下接口.
abstract class StartupView {
Stream<String> get onAppSelected;
set showActivity(bool activity);
set message(String message);
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个StartupPage实现此接口的StatefulWidget .我希望Widget能够执行以下操作:
按下按钮时,它将通过onAppSelected流发送事件.控制器甚至会监听它并执行一些操作(db调用,服务请求等).
控制器可以调用showActivity或set message使视图显示消息进度.
因为有状态窗口小部件不会将其状态作为属性公开,所以我不知道访问和修改状态属性的最佳方法.
我希望使用它的方式如下:
Widget createStartupPage() {
var page = new StartupPage();
page.onAppSelected.listen((app) {
page.showActivity = true;
//Do some work
page.showActivity = false;
});
}
Run Code Online (Sandbox Code Playgroud)
我已经考虑通过传递我希望它返回的状态来实例化Widget createState()但是感觉不对.
关于我们为什么采用这种方法的一些背景:我们目前有一个Dart Web应用程序.对于视图 - 控制器分离,可测试性和对Flutter的前瞻性思考,我们决定为应用程序中的每个视图创建一个接口.这将允许WebComponent或Flutter Widget实现此接口并使所有控制器逻辑保持不变.
这段代码非常简单:显示了一个有模式的底部工作表,当用户单击该按钮时,它会将工作表的高度增加10。
但是什么也没发生。实际上,只有在用户用手指“滑动”底部工作表的情况下,它才会更新其大小(我相信滑动会在工作表上产生内部setState)。
我的问题是:如何调用ModalBottomSheet的更新状态?
showModalBottomSheet(
context: context,
builder: (context) {
return Container(
height: heightOfModalBottomSheet,
child: RaisedButton(
onPressed: () {
setState(() {
heightOfModalBottomSheet += 10;
});
}),
);
});
Run Code Online (Sandbox Code Playgroud)