2017-05-04 1231 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中的大部分地方)。