我有一个带状态的窗口小部件,其中有一个动画容器。在该动画容器中,我有一个连接到firebase的streamProvider。我的问题是,当我使用setState制作动画时,整个小部件都会重新生成,并再次调用firebase。我的解决方案是提起streamProvider并包装用该streambuilder设置动画的小部件。但这意味着我需要创建另一个小部件,从而创建更多样板。
我觉得我在做错了,但由于所有提供程序资源都与身份验证相关,所以我有点受阻...
有人对我如何以一种干净的方式解决这个问题有任何想法吗? setState是在有状态的小部件中触发动画的正确方法吗?
要进行动画制作,请尝试使用AnimatedBuilder
进行动画制作的最简单方法,但我想它不能解决您的问题。
我个人总是使用Provider程序包,我也不知道您是否也在使用它。
因此,通常,firebase为您提供数据流(如果您将其与具有不同功能的云功能一起使用)
现在您可以在流Firebase为您提供并使用流数据的情况下使用StreamBuilder
。使用此版本重建时,小部件将不会导致应用程序连接到服务器并获取新数据。
如果您真的想使用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
},
),
);
}
}
我希望这能回答您的问题。