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

问题描述 投票:0回答:2

我正在尝试设计一种Flutter应用程序的好方法。我有几个页面,可以浏览到其他页面。由一页修改的数据可能会被其他页面使用,并且需要更新。我最近开始使用提供程序包。我让每个页面都有一个实现ChangeNotifier的模型,并在MaterialApp上方设置一个ChangeNotifierProvider。现在要更新其他页面的数据,我必须获取其他页面的模型并对其调用更新方法。太乱了我使用Firestore,所以我可以听数据库更改,但是我想避免过多的魔术。同样,有时仅将数据从一个页面发送到另一页面而不使用网络调用,或者在Navigator.pop方法中将数据传回也是有意义的。我发现很难就如何解决这个问题做出正确的选择。我可能应该看看更精致的架构,例如redux或mobx。或者只是寻求一种通用的解决方案,并对所有各种事件使用大量的回调。每页那些big'ol模型在一段时间后似乎有点肿和混乱。有人在Flutter有类似的经验如何设计这些东西吗? Confused

flutter design-patterns architecture google-cloud-firestore flutter-provider
2个回答
1
投票

使用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 */);

我在这里已经简化了,但是这[[can是一种以响应方式处理数据的非常健壮的方法。

而且美丽之处在于,您可以将Observable绑定到StreamBuilder(Flutter的一部分),也可以使UI具有反应性!

1
投票
使用提供程序(或任何实现BloC模式的库)和存储库模式应该可以在本地移动/存储数据。基本上,每个Bloc / Provider都会获取该存储库的一个实例并对其进行读/写值。因为存储库实例始终是相同的,所以您将更新所有数据。

此外,您可以使用本地数据库,例如SQLite(带有sqflite软件包)或作为纯NoSQL数据库的Hive。

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

© www.soinside.com 2019 - 2024. All rights reserved.