簡體   English   中英

State 在 Flutter 中處理多頁

[英]State handeling in Flutter with multiple pages

我試圖找出一種構建 Flutter 應用程序的好方法。 我有幾個頁面,可以導航到其他頁面。 一頁修改的數據,可能會被其他頁使用,需要更新。 我最近開始使用 Provider package。 我讓每個頁面都有一個實現 ChangeNotifier 的 model 並在 MaterialApp 上方設置一個 ChangeNotifierProvider。 現在要更新其他頁面的數據,我必須獲取其他頁面的 model 並在其上調用更新方法。 這很亂。 我使用 Firestore,所以我可以監聽數據庫的變化,但我想避免太多的魔法。 此外,有時只將數據從一個頁面發送到另一個頁面而不使用網絡調用,或者在 Navigator.pop 方法中將數據傳回是有意義的。 我發現很難在如何解決這個問題上做出好的選擇。 我可能應該看看更精致的架構,比如 redux 或 mobx。 或者只是 go 用於普通解決方案,並為所有各種事件使用大量回調。 每頁那些big'ol模型,一段時間后似乎有點臃腫和凌亂。 有沒有人在 Flutter 如何架構這些東西方面有類似的經驗? 使困惑

使用provider應用BLoC模式並將其與RxDart結合是解決此問題的一種方法。

例如,您可以創建一個AppBloc

class AppBloc {
  StreamController<UserInputState> _userInputController =
    BehaviorSubject<UserInputState>.seeded(UserInputState('NOTHING'));
  StreamSink<UserInputState> get userInputSink => _userInputController.sink;
  Observable<UserInputState> get userInputObs => Observable(_userInputController.stream);

  AppBloc();
}

class UserInputState {
  final String input;

  const UserInputState(this.input);
}

在頁面上,您可以通過它傳遞數據:

final appBloc = Provider.of<AppBloc>(context);
appBloc.userInputSink.add(UserInputState("input"));

另一個頁面可以監聽數據:

final appBloc = Provider.of<AppBloc>(context);
appBloc.userInputObs.
    .where((state) => state.input == "input")
    .listen((state) => /* do something */);

我在這里對其進行了簡化,但這可能是一種以反應方式處理數據的非常穩健的方式。

美妙之處在於您可以將Observable綁定到StreamBuilder (Flutter 的一部分)以使 UI 也具有響應性!

使用 Provider(或任何實現 BloC 模式的庫)和存儲庫模式應該可以在本地移動/存儲數據。 基本上,每個 Bloc/Provider 都會獲取存儲庫的一個實例並對其進行讀/寫值。 因為存儲庫實例始終相同,所以您將更新所有數據。

此外,您可以使用本地數據庫,如 SQLite(使用 sqflite 包)或 Hive,這是一個純 NoSQL 數據庫。

我個人不喜歡 Redux,但 mobx 是一個非常好的選擇。

暫無
暫無

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

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