![](/img/trans.png)
[英]how to change the state of one statefulwidget from another in flutter?
[英]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.