簡體   English   中英

Flutter/Dart - 如何從另一個文件中的另一個 StatefulWidget 更改 StatefulWidget 的 State?

[英]Flutter/Dart - How can I change the State of a StatefulWidget from another StatefulWidget in a different file?

背景:我有一個用於導航欄的 StatefulWidget,它將當前頁面的圖標顯示為活動狀態。 如果用戶從導航欄中單擊不同的圖標,它已經正確更新。 但是,如果用戶單擊導航欄外部的按鈕,我還需要它來更新活動圖標,其代碼位於不同的 StatefulWidget 中。 為此,我想象按鈕的 function 應該從導航欄 StatefulWidget 調用 function,它使用 setState 和作為參數傳遞的索引來更新活動圖標。 但是,到目前為止,我的嘗試都沒有奏效。 發生以下錯誤:

處理手勢時拋出以下斷言:
I/flutter (24216): setState() called in constructor: TabsState#1bf6b(lifecycle state: created, no widget, not mounted) I/flutter (24216): This happens when you call setState() on a State object for a尚未插入 I/flutter (24216) 的小部件:尚未插入小部件樹。 沒有必要在構造函數中調用 setState(),因為 state 是
I/flutter (24216):在最初創建時已經假定它是臟的。`}

父小部件的代碼是:

[...]
  Tabs({Key key, this.menuScreenContext, this.initialIndex}) : super(key: key);

  final int initialIndex;

  @override
  TabsState createState() => TabsState();
}

class TabsState extends State<Tabs> {
  PersistentTabController controller;

  @override
  void initState() {
    super.initState();
    controller = PersistentTabController(initialIndex: widget.initialIndex);
  }

  List<Widget> _buildScreens() {
    return [
      HomeScreen(),
[...]
void updateIndex(int index) {
    setState(() {
      controller.index = index;
    });
  }
}

子小部件的代碼(類 _HomeScreenState 擴展 State ):

[...]  
    CustomButton(
            function: () {
              final tabsState = TabsState();
              tabsState.updateIndex(2);
[...]

我試圖通過在調用 setState() 之前在子小部件上調用 initState() 來解決它,但這不起作用,據我了解,它創建了另一個與 Stateful Widget 關聯的 State object,這似乎是錯誤的方法這種情況下,因為我只想更改現有導航欄 object 的 State。
我的問題是:我如何調用這個 function updateIndex(int index),它使用 setState 來更新導航欄活動圖標,從另一個 StatefulWidget 中的按鈕 function 成功,位於不同的文件中?

我做到了! 根據對這個問題的回答( Controlling State from outside of a StatefulWidget ),我了解到訪問不同 StatefulWidget 的 State 的方法是:

1-> 使用查找該類型祖先的 findAncestorStateOfType 聲明要在子小部件有狀態小部件上更改的 State class 。 例如:

class HomeScreen extends StatefulWidget { 
  static TabsState of(BuildContext context) =>context.findAncestorStateOfType<TabsState>(); 

2-> call the function from wherever you need inside the state class of this stateful widget, referring to the stateful widget class and using "of(context)". 例如:

function: () {
          HomeScreen.of(context).updateIndexFromCart(2);

3-> 這個 function 應該位於您之前提到的有狀態小部件的 state class 內部,然后可以正常使用 setState。 例如:

void updateIndexFromCart(int index) {
setState(() {
  controller.index = index;
  cartScreenFlag = true;
});

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM