flutter - Flutter Firebase 提供程序架构
问题描述
我有一个有状态的小部件,它有一个动画容器。在那个动画容器内,我有一个连接到 firebase 的 streamProvider。我的问题是,当我使用 setState 制作动画时,整个小部件都会重建,并且会再次调用 firebase。我的解决方案是提升 streamProvider 并包装使用该流构建器进行动画处理的小部件。但这意味着我需要创建另一个小部件,因此需要更多样板。
我觉得我正在做的事情是错误的,但我有点卡住了,因为所有提供者资源都与身份验证有关......
有谁知道如何以干净的方式解决这个问题?setState 是在有状态小部件中触发动画的正确方法吗?
解决方案
对于动画,尝试使用AnimatedBuilder
它最简单的动画方法,但我想它不会解决你的问题。
就我个人而言,我总是使用 Provider 包,我不知道你是否也在这样做。
所以通常firebase为您提供数据流(如果您将它与云功能一起使用,则不同)
现在您可以使用StreamBuilder
Stream firebase 为您提供并使用流的数据。在此版本中,重建 Widget 不会导致应用程序连接到服务器并获取新数据。
如果您真的喜欢使用 aChangeNotifier
您可以在 中使用该流ChangeNotifier
,收听它并始终通知侦听器此实现发生的更改,也不会有任何不必要的网络调用。
第二个版本的一些例子:
class SomeNotifier extends ChangeNotifier {
List<MyData> dataList = [];
SomeNotifier() {
Firestore.instance.collection("MyCollection").snapshots().listen((data) {
dataList = data.documents.map((doc) => MyData.fromDoc(doc));
notifyListeners();
});
}
}
class _MyWidgetState extends State<MyWidget>
with SingleTickerProviderStateMixin {
AnimationController _controller;
@override
void initState() {
_controller = AnimationController(vsync: this);
super.initState();
}
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<SomeNotifier>(
create: (context) => SomeNotifier(),
child: AnimatedBuilder(
animation: _controller,
builder: (context, child) {
var notifier = Provider.of<SomeNotifier>(context);
return Container(); //Here you can use your animated widget, it will be rebuilt to animate propperly
//It will also rebuild every time data in firebase changes
},
),
);
}
}
我希望这回答了你的问题。
推荐阅读
- jboss - JBoss EAP 7.0 检查启动
- angularjs - 如何在AngularJS中按值排序字典
- django - 涟漪 RPC 方法 account_tx 'date' 属性问题
- mysql - 快递和mysql。行未定义
- python - Django框架中的“登录”错误
- flask - flask babel 不适用于视图返回的字符串
- woocommerce - Woocommerce 在导航上移动欢迎消息
- postgresql - pg 9.4 vs 10 按 random() 排序的差异
- mysql - mysql显示所有列,但某些列是唯一的
- sql-server - 是否需要按时间间隔在 MS sql 服务器上重建非聚集索引