簡體   English   中英

選擇正確的Flutter設計模式

[英]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.

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