首页 > 解决方案 > Flutter Firebase 提供程序架构

问题描述

我有一个有状态的小部件,它有一个动画容器。在那个动画容器内,我有一个连接到 firebase 的 streamProvider。我的问题是,当我使用 setState 制作动画时,整个小部件都会重建,并且会再次调用 firebase。我的解决方案是提升 streamProvider 并包装使用该流构建器进行动画处理的小部件。但这意味着我需要创建另一个小部件,因此需要更多样板。

我觉得我正在做的事情是错误的,但我有点卡住了,因为所有提供者资源都与身份验证有关......

有谁知道如何以干净的方式解决这个问题?setState 是在有状态小部件中触发动画的正确方法吗?

标签: flutterdartflutter-layoutflutter-animation

解决方案


对于动画,尝试使用AnimatedBuilder它最简单的动画方法,但我想它不会解决你的问题。

就我个人而言,我总是使用 Provider 包,我不知道你是否也在这样做。

所以通常firebase为您提供数据流(如果您将它与云功能一起使用,则不同)

现在您可以使用StreamBuilderStream 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
        },
      ),
    );
  }
}

我希望这回答了你的问题。


推荐阅读