2017-05-04 1229 views

回答

0

你的Widget应该有一个setState()方法,每次调用这个方法时,都会重绘该Widget。

Documentation : Widget setState()

+0

你是说我应该替换顶级小部件(root)的状态?如果我无法访问该小部件,该怎么办?我想告诉Flutter本质上重启。 – DogeLion

+0

你想重新加载整个应用程序? –

+0

我想迫使应用程序(包括视图视图栈深)重绘(如标题所说)。从我将触发的地方,我无法访问根部件。 – DogeLion

11

这种类型的使用情况,您有数据,孩子可以读,但你不希望将数据明确地传递给所有孩子的构造函数的参数,通常要求一个InheritedWidget。 Flutter会自动追踪哪些小部件依赖于数据,并重建已更改的树部分。有一个LocaleQuery小部件用于处理区域设置更改,您可以看到它在Stocks example app中的使用方式。

简单地说,这里就是股票是这样做的:

  • 放在根小部件的回调(在这种情况下,StocksApp),用于处理现场的变化。此回调做了一些工作,然后返回LocaleQueryData
  • 注册此回调为onLocaleChanged参数需要的语言环境信息使用LocaleQuery.of(context)MaterialApp构造
  • 子部件的定制实例。
  • 当语言环境更改时,Flutter仅重绘对语言环境数据具有依赖关系的小部件。

如果你想跟踪比语言环境的变化以外的东西,你可以让自己的类,它扩展InheritedWidget,并将其包含在您的应用程序的根附近的层次结构。它的父母应该是StatefulWidget,其密钥设置为GlobalKey,儿童可以访问该密钥。 StatefulWidgetState应拥有您想要分发的数据,并公开用于更改它的方法,即调用setState。如果子窗口小部件想要更改State的数据,他们可以使用全局键获取指向Statekey.currentState)的指针并调用它的方法。如果他们要读取的数据,他们可以打电话给你的InheritedWidget子类的静态of(context)方法,这将告诉扑,这些部件需要重建时,您的电话StatesetState

+0

呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜,尝试一下。 – hackingspirit

+0

这个例子仍然在股票的例子? –

0

什么可能适用于您的用例是使用导航器重新加载页面。我在我的应用程序中在“真实”和“演示”模式之间切换时执行此操作。这里有一个例子:

Navigator.of(context).push(
    new MaterialPageRoute(
     builder: (BuildContext context){ 
      return new SplashPage(); 
     } 
    ) 
); 

可以更换“新SplashPage()”在任何主要部件(或屏幕),你想重新加载上面的代码。这个代码可以在任何你有权访问BuildContext的地方调用(这是UI中的大部分地方)。