Flutter Firebase 提供程序架构
Flutter firebase provider architecture
我有一个带有动画容器的有状态小部件。在那个动画容器内,我有一个连接到 firebase 的 streamProvider。我的问题是,当我使用 setState 制作动画时,整个小部件会重建,并且会再次调用 firebase。我的解决方案是提升 streamProvider 并包装使用该 streambuilder 设置动画的小部件。但这意味着我需要创建另一个小部件,因此需要创建更多样板。
我觉得我做的是错的,但我有点卡住了,因为所有提供者资源都与身份验证有关...
有没有人知道我如何以干净的方式解决这个问题? setState 是在有状态小部件中触发动画的正确方法吗?
要制作动画,请尝试使用 AnimatedBuilder
这是制作动画最简单的方法,但我想这不会解决您的问题。
我个人一直使用Provider包,不知道你是不是也在用
所以通常 firebase 会为您提供数据流(如果您将其与云功能一起使用则不同)
现在您可以使用 StreamBuilder
和 firebase 提供的 Stream 并使用流的数据。使用此版本重建小部件不会导致应用程序连接到服务器并获取新数据。
如果您真的喜欢使用 ChangeNotifier
,您可以在 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
},
),
);
}
}
我希望这能回答你的问题。
我有一个带有动画容器的有状态小部件。在那个动画容器内,我有一个连接到 firebase 的 streamProvider。我的问题是,当我使用 setState 制作动画时,整个小部件会重建,并且会再次调用 firebase。我的解决方案是提升 streamProvider 并包装使用该 streambuilder 设置动画的小部件。但这意味着我需要创建另一个小部件,因此需要创建更多样板。
我觉得我做的是错的,但我有点卡住了,因为所有提供者资源都与身份验证有关...
有没有人知道我如何以干净的方式解决这个问题? setState 是在有状态小部件中触发动画的正确方法吗?
要制作动画,请尝试使用 AnimatedBuilder
这是制作动画最简单的方法,但我想这不会解决您的问题。
我个人一直使用Provider包,不知道你是不是也在用
所以通常 firebase 会为您提供数据流(如果您将其与云功能一起使用则不同)
现在您可以使用 StreamBuilder
和 firebase 提供的 Stream 并使用流的数据。使用此版本重建小部件不会导致应用程序连接到服务器并获取新数据。
如果您真的喜欢使用 ChangeNotifier
,您可以在 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
},
),
);
}
}
我希望这能回答你的问题。