Архитектура провайдера Flutter Firebase - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть виджет с состоянием, в котором есть анимированный контейнер. Внутри этого анимированного контейнера у меня есть streamProvider, подключенный к firebase. Моя проблема в том, что, когда я анимирую с помощью setState, весь виджет перестраивается и делается еще один вызов firebase. Мое решение состояло в том, чтобы поднять streamProvider и обернуть виджет, который анимирован с этим streambuilder. Но это означает, что мне нужно создать другой виджет и, следовательно, больше шаблонов.

Мне кажется, что я делаю неправильно, но я застрял, потому что все ресурсы провайдера связаны с аутентификацией ...

У кого-нибудь есть идеи, как мне обойтись? это в чистом виде? и является ли setState правильным способом для запуска анимации в виджете с состоянием?

1 Ответ

0 голосов
/ 16 апреля 2020

Для анимации попробуйте использовать AnimatedBuilder, это самый простой способ для анимации, но я думаю, это не решит вашу проблему.

Лично я всегда использую пакет провайдера, я не знаю, если вы тоже это делают.

Так что обычно firebase предоставляет вам поток данных (если вы используете его с облачными функциями, они разные)

Теперь вы можете использовать StreamBuilder с Stream FireBase предоставляет вам и использовать данные потока. В этой версии перестройка виджета не приведет к подключению приложения к серверу и получению новых данных.

Если вы действительно хотите использовать 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
        },
      ),
    );
  }
}

I надеюсь, что это отвечает на ваш вопрос.

...