当前位置: 首页 > 知识库问答 >
问题:

如何强制飘飘重建/重绘所有小部件?

陶涵育
2023-03-14

有没有一种方法可以强制Flutter重画所有的窗口小部件(比如在区域设置改变之后)?

共有3个答案

白高逸
2023-03-14

在这种类型的用例中,您有子级可以读取的数据,但您不想显式地将这些数据传递给所有子级的构造函数参数,这通常需要一个< code>InheritedWidget。Flutter会自动跟踪哪些窗口小部件依赖于这些数据,并重新构建你的树中已经改变的部分。有一个< code>LocaleQuery小部件用于处理语言环境的更改,您可以在股票示例应用程序中看到它的用法。

简单地说,股票正在做什么:

  • 在根小部件(在本例中为 StocksApp)上放置一个回调,以处理区域设置更改。此回调执行一些工作,然后返回区域设置查询数据的自定义实例
  • 将此回调注册为材料应用程序构造函数的 onLocale 已更改参数
  • 需要区域设置信息的子构件使用区域设置查询(上下文)
  • 当区域设置更改时,Flutter 仅重绘对区域设置数据具有依赖关系的小部件。

如果您想跟踪语言环境更改以外的内容,可以创建自己的扩展InheritedWidget的类,并将其包含在应用程序根附近的层次结构中。它的父级应该是一个StatefulWidget,键设置为子级可以访问的全局键。StatefulWidget的State应该拥有要分发的数据,并公开调用setState的方法来更改它。如果子窗口小部件想要更改State的数据,它们可以使用全局键获取指向State )的指针并调用其方法。如果他们想读取数据,他们可以调用 InheritedWidget子类的静态 of(context)method,这将告诉Flutter,无论何时,只要您的 setState ,就需要重新构建这些小部件。

甄阿苏
2023-03-14

老问题,但这是解决方案:

生成方法中,调用“全部子项”函数并向其传递上下文

@override
Widget build(BuildContext context) { 
  rebuildAllChildren(context);
  return ...
}

void rebuildAllChildren(BuildContext context) {
  void rebuild(Element el) {
    el.markNeedsBuild();
    el.visitChildren(rebuild);
  }
  (context as Element).visitChildren(rebuild);
}

这将访问所有儿童,并将他们标记为需要重建。如果将此代码放在小部件树中最顶部的小部件中,它将重新构建所有内容。

还要注意,您必须订购特定小部件来进行重建。你也可以使用一些布尔函数,这样当你真正需要的时候,部件的重建只需要重建它的所有子部件(当然,这是一个昂贵的操作)。

重要提示:这是一个黑客行为,只有当你知道你在做什么,并且有很强的理由这样做时,你才应该这样做。我的国际化包i18_extension就是一个例子。正如科林·杰克逊在他的回答中解释的那样,一般情况下你真的不应该这么做。

阎兴为
2023-03-14

您的< code >小部件应该有一个< code>setState()方法,每次调用该方法时,都会重画小部件。

文档:Widget setState()

 类似资料:
  • 找不到名为“androidx”的选项。运行“flutter-h”(或“flutter-h”)以获取可用的颤振命令和选项。 我从android studio 3.6.1创建项目。 E: \软衣服\颤动 [√] Android toolchain -为Android设备开发(Android SDK版本28 . 0 . 3)< br > Android SDK位于E:\ SOFTWEAR \ ADT-b

  • 我有自定义的本地iOS和Android库。现在我需要创建一个包含这些库的Flitter插件,用于开发使用这些库的Flatter应用程序。我已经在Flutter插件项目中设置了iOS库。但我很难包含Android库。Android库是一个.aar文件。我在网上搜索,但找到的信息有限。这些解决方案都不起作用。基本上,问题是:构建aar时不支持直接本地.aar文件依赖关系。 这里有一个关于这个的讨论。但

  • 飘刃 (Piao Ren) Vue 项目前端工程构建工具,使用 Rollup 打包 特点优势 源码少,除去第三方工具,飘刃所有核心代码共8个文件不到1000行,看源码不头疼 速度快,开发过程中无需 babel 转译,飘刃只转 import/export ,其余直接输出到浏览器 效率高,使用谷歌浏览器 99.9% 源码调试,无需 source map ,告别组件 this 乱指 window 够直观

  • 问题内容: 我在程序开始时,根据数据库中的某些内容,以编程方式在JScrollPane中添加了许多组件(JPanels,JLabels等)。 似乎对于GUI(?)而言,此过程太快了,因此JScrollPane并不总是正确更新,即,即使内部JPanel大于可见区域,滚动条也不可见。 调整窗口大小(JFrame)可以解决此问题,因为我认为Java在调整组件大小时会重新打印它们。 作为测试,我添加了一个

  • 问题内容: 我有一些琐碎的JavaScript可以实现样式更改: 在最新版本的FF,Opera和IE上可以正常使用,但在最新版本的Chrome和Safari上无法使用。 它影响了两个后代,它们恰好是兄弟姐妹。第一个同级更新,但第二个不更新。第二个元素的子元素也具有焦点,并包含 < a>标记,该标记在 onclick 属性中包含上述代码。 如果我微调(例如取消选中和选中) 任何 元素的 任何 属性,

  • 我正在创建一个针对Android/iOS和Web的Flutter项目。是否有任何方法可以分别为Flutter移动和Web添加支持的软件包。例如,我在Flutter移动应用程序中使用dart:io包来保存文件,但Flutter web不支持它,因此对于web,我使用dart:js包来下载web应用程序中的文件。 对于C#,我们只是使用条件符号,但Flutter我找不到任何解决方案。 问题是我无法在我