具有多个页面的 Flutter 中的状态处理

State handeling in Flutter with multiple pages

我正在尝试找出构建 Flutter 应用程序的好方法。我有几个页面,可以导航到其他页面。一个页面修改的数据,可能被其他页面使用,需要更新。我最近开始使用 Provider 包。我让每个页面都有一个实现 ChangeNotifier 的模型,并在 MaterialApp 之上设置一个 ChangeNotifierProvider。现在要更新其他页面的数据,我必须获取其他页面的模型并对其调用更新方法。这很乱。我使用 Firestore,所以我可以监听数据库的变化,但我想避免太多魔法。此外,有时只将数据从一个页面发送到另一个页面而不使用网络调用或在 Navigator.pop 方法中传回数据是有意义的。我发现很难在如何解决这个问题上做出好的选择。我可能应该看看更精致的架构,如 redux 或 mobx。或者只是寻求一个普通的解决方案,并为所有各种事件使用大量的回调。每页那些 big'ol 模型,一段时间后似乎有点臃肿和凌乱。有没有人在 Flutter 中有类似的经验来构建这些东西? 困惑

使用 Provider(或任何实现 BloC 模式的库)和 Repository 模式应该可以在本地处理 move/store 数据。基本上每个 Bloc/Provider 都会得到一个存储库实例和 read/write 值。因为存储库实例始终相同,所以您将更新所有数据。

此外,您还可以使用本地数据库,如 SQLite(带有 sqflite 包)或纯 NoSQL 数据库 Hive。

我个人不喜欢 Redux,但 mobx 是一个非常好的选择。

使用 provider to apply the BLoC pattern and combining it with 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 也具有响应性!