[英]Choosing the correct Flutter design pattern
我創建了一個Flutter頁面,其中包含大量輸入。 我認為這是一團糟,讓我們對其進行重構,並為每個輸入創建一個新的有狀態小部件。
這很棒,除了數據需要放在父窗口小部件中,而且我很難理解如何將數據從新的子窗口小部件傳遞回父窗口。
我發現了一種hacky方式,您可以在其中傳遞函數,並且每當發生更改時,您都可以通過該函數將數據傳遞給父級。可以,但是現在有多個變量,一個在子級中,一個在父級中。
我已經讀過有關bloc模式的信息,但是我不確定這是否是我需要的。 我只想要一個單例樣式的對象,主窗口小部件及其子對象都可以讀取,並且當有新輸入時,子對象也可以更新。
有人會解釋一下bloc模式是否可以幫助我解決這個問題,或者是否有另一種設計模式可以幫助我解決這個問題。
**編輯
謝謝大家的精彩回答。 我的新問題與提供者模式/庫有關。
我創建了一些狀態類,如下所示(用替換掉的內容嘗試保持簡單)
class State1 with ChangeNotifier{
String _s;
set s(String newS){
_s = newS;
notifyListeners();
}
}
然后我使用multiprovider傳遞它(在init中創建對象)
child: MultiProvider(
providers: [
ChangeNotifierProvider(builder: (context) => state1),
],
child: Stack(
alignment: Alignment.center,
children: stackChildren,
),
然后在子級Widegets構建方法中使用以下方法訪問
state1Var = Provider.of<State1>(context);
所有這些都很好。
我的問題是,當我開始使用導航推送時,無法再訪問該狀態。
onPressed: (() {
Navigator.push(
contextField,
MaterialPageRoute(builder: (context) => NewPage()),
);
}),
當我得到這個錯誤
Could not find the correct Provider<State1> above this NewPage Widget...
我確實設法使用它
Navigator.push(
context,
MaterialPageRoute(builder: (context) => Consumer(builder: (),child: NewPage(),)),
);
但是,當我使用navigator.pop()彈出小部件時,無法使用該狀態,因為它說它已經被丟棄了。
對不起,如果我把這個弄復雜了。 我不得不刪除很多代碼。
您需要使用stateManagement。
它存在BLoC,但您也可以毫無問題地使用Provider,它將解決您的問題。
這是迭戈·韋拉斯克斯(Diego Velasquez)撰寫的有關小部件通信的內容 ,可以解決您的問題。
但是,如果您需要更多信息,我將向Karthik Ponnam提出有關Provider狀態管理的信息 。
這將幫助您進一步了解Flutter Docs的狀態管理是什么
如您所知,每當我們有隨時間變化的數據以及我們希望UI更新時,都會使用StatefulWidget 。 StatefulWidget可以更新數據而不能更新數據,並且可以重新渲染屏幕,但是問題在於它無法擴展到具有多個不同屏幕的大型應用程序。
使用StatefulWidget ,將數據從一個屏幕傳遞到應用程序中的另一個屏幕具有挑戰性。 StatefulWidget更像是一種初學者方式,用於展示如何在顫動的應用程序中傳遞狀態。
對於生產級別的應用程序,存在BLOC模式 ,這是在Flutter應用程序內部管理狀態的另一種方式。 還有其他方法,但是FLOC團隊強烈建議使用BLOC模式 。 他們相信這是最好的做事方式。 需要明確的是,沒有人會告訴您該怎么做的專業知識,但是作為國際風雲榜,撲撲團隊再次公開認可了BLOC模式 ,對我來說,如果您遇到麻煩,那將是一個很好的支持,因為這很有挑戰性了解。
我認為Felix Angelov開發了BLoC模式。 它有許多示例可以為您提供幫助,並且使用起來非常簡單,建議從flutter中獲得,這里是鏈接https://github.com/felangel/bloc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.