回答
你的Widget应该有一个setState()方法,每次调用这个方法时,都会重绘该Widget。
这种类型的使用情况,您有数据,孩子可以读,但你不希望将数据明确地传递给所有孩子的构造函数的参数,通常要求一个InheritedWidget
。 Flutter会自动追踪哪些小部件依赖于数据,并重建已更改的树部分。有一个LocaleQuery
小部件用于处理区域设置更改,您可以看到它在Stocks example app中的使用方式。
简单地说,这里就是股票是这样做的:
- 放在根小部件的回调(在这种情况下,
StocksApp
),用于处理现场的变化。此回调做了一些工作,然后返回LocaleQueryData
- 注册此回调为
onLocaleChanged
参数需要的语言环境信息使用LocaleQuery.of(context)
的MaterialApp
构造 - 子部件的定制实例。
- 当语言环境更改时,Flutter仅重绘对语言环境数据具有依赖关系的小部件。
如果你想跟踪比语言环境的变化以外的东西,你可以让自己的类,它扩展InheritedWidget
,并将其包含在您的应用程序的根附近的层次结构。它的父母应该是StatefulWidget
,其密钥设置为GlobalKey
,儿童可以访问该密钥。 StatefulWidget
的State
应拥有您想要分发的数据,并公开用于更改它的方法,即调用setState
。如果子窗口小部件想要更改State
的数据,他们可以使用全局键获取指向State
(key.currentState
)的指针并调用它的方法。如果他们要读取的数据,他们可以打电话给你的InheritedWidget
子类的静态of(context)
方法,这将告诉扑,这些部件需要重建时,您的电话State
setState
。
呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜,尝试一下。 – hackingspirit
这个例子仍然在股票的例子? –
什么可能适用于您的用例是使用导航器重新加载页面。我在我的应用程序中在“真实”和“演示”模式之间切换时执行此操作。这里有一个例子:
Navigator.of(context).push(
new MaterialPageRoute(
builder: (BuildContext context){
return new SplashPage();
}
)
);
可以更换“新SplashPage()”在任何主要部件(或屏幕),你想重新加载上面的代码。这个代码可以在任何你有权访问BuildContext的地方调用(这是UI中的大部分地方)。
- 1. 如何强制小部件重绘自己
- 2. 强制重绘WPF控件
- 3. RewriteEngine强制所有重写?
- 4. Perl Curses :: UI窗口不会绘制所有小部件
- 5. 如何在更改某些小部件的属性后强制重绘小部件?
- 6. 强制屏幕重绘
- 7. Android:强制MapView重绘
- 8. 强制形式重绘?
- 9. 强制重绘视图
- 10. 如何强制TableRow重绘
- 11. 如何强制GWT小部件更新?
- 12. 强制Android小部件更新
- 13. 强制ConfigurationManager中重新加载所有部分
- 14. Flutter删除所有路由
- 15. 通过位图绘制小部件
- 16. 如何绘制子类DrawingArea小部件?
- 17. 在动作中强制更小的重绘区域
- 18. 所有者绘制组合框的垂直大小大于非所有者绘制组合框的大小
- 19. Winforms所有者绘制的控件和调整大小
- 20. 强制GAE更新部署中的所有文件
- 21. SL 4 - 强制重绘视觉树
- 22. Flash Bug - 强制屏幕重绘
- 23. 如何在循环中强制重绘?
- 24. 强制重绘按钮,点击后
- 25. iPhone:强制UIButton重绘自己
- 26. 如何强制窗口重绘?
- 27. 刷新或强制重绘片段
- 28. 在JavaFx中强制重绘节点
- 29. 强制Richtextbox重绘其前景
- 30. 如何在JS中强制重绘?
你是说我应该替换顶级小部件(root)的状态?如果我无法访问该小部件,该怎么办?我想告诉Flutter本质上重启。 – DogeLion
你想重新加载整个应用程序? –
我想迫使应用程序(包括视图视图栈深)重绘(如标题所说)。从我将触发的地方,我无法访问根部件。 – DogeLion