Flutter Firebase提供程序体系结构

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

我有一个带状态的窗口小部件,其中有一个动画容器。在该动画容器中,我有一个连接到firebase的streamProvider。我的问题是,当我使用setState制作动画时,整个小部件都会重新生成,并再次调用firebase。我的解决方案是提起streamProvider并包装用该streambuilder设置动画的小部件。但这意味着我需要创建另一个小部件,从而创建更多样板。

我觉得我在做错了,但由于所有提供程序资源都与身份验证相关,所以我有点受阻...

有人对我如何以一种干净的方式解决这个问题有任何想法吗? setState是在有状态的小部件中触发动画的正确方法吗?

flutter dart flutter-layout flutter-animation
1个回答
0
投票

要进行动画制作,请尝试使用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
        },
      ),
    );
  }
}

我希望这能回答您的问题。

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