Автоматическое изменение состояния Flutter riverpod в зависимости от события

Я новичок в Riverpod, и, хотя статьи были полезны для начала, я борюсь с устаревшим состоянием.

Когда пользователь входит в систему, я устанавливаю какое-то состояние. Когда детали изменения состояния в БД, я хочу, чтобы перестройка происходила автоматически. Хотя я могу получить поток из БД, я не могу связать изменение БД с состоянием Riverpod.

Шаблон для сотрудничества. Когда два пользователя работают над одной и той же частью приложения на независимых телефонах, планшетах и ​​т. Д.

Я использую поток документов и потоки сбора из firecloudstore.

Есть какие-нибудь полезные статьи или как вы решили эту проблему с помощью riverpod? Нужно ли мне тратить время на изучение чего-то вроде BLoC для этого?


person Sravan Kumar Nerella    schedule 16.03.2021    source источник
comment
Зависит от того, какого конкретного поставщика RiverPod вы используете, но вы хотите вызвать метод, который в конечном итоге вызовет вызов notifyListeners ().   -  person Randal Schwartz    schedule 17.03.2021


Ответы (1)


Вам определенно не нужно изучать BLoC, чтобы добиться желаемого.

Вы говорите, что используете потоки Firebase, поэтому вот пример живого восстановления при изменении ваших данных.

Во-первых, ваш уровень репозитория.

class YourRepository {
  YourRepository(this._read);

  static final provider = Provider((ref) => YourRepository(ref.read));
  
  final Reader _read;

  Stream<YourModel?> streamById(String id) {
    final stream = FirebaseFirestore.instance.collection('YourCollection').doc(id).snapshots();
    return stream.map((event) => event.exists ? YourModel.fromJson(event.data()!) : null);
  }
}

Затем определите StreamProvider, который читает поток, определенный в вашем репозитории.

final streamYourModelById = StreamProvider.autoDispose.family<YourModel?, String>((ref, id) {
  return ref.watch(YourRepository.provider).streamById(id);
});

Наконец, используйте StreamProvider в виджете для перезагрузки при изменении данных.

// Hooks
class YourWidget extends HookWidget {
  const YourWidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: useProvider(streamYourModelById('YourDataId')).when(
        loading: () => const Center(child: CircularProgressIndicator()),
        error: (err, stack) => Center(child: Text(err.toString())),
        data: (yourData) => Center(child: Text(yourData?.toString() ?? 'Got Null')),
      ),
    );
  }
}

// Without Hooks
class YourWidget extends ConsumerWidget {
  const YourWidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context, ScopedReader watch) {
    return Scaffold(
      body: watch(streamYourModelById('YourDataId')).when(
        loading: () => const Center(child: CircularProgressIndicator()),
        error: (err, stack) => Center(child: Text(err.toString())),
        data: (yourData) => Center(child: Text(yourData?.toString() ?? 'Got Null')),
      ),
    );
  }
}

Вы должны уметь применять этот шаблон для выполнения всего, что вам нужно.

person Alex Hartford    schedule 17.03.2021
comment
Похоже, я усложняю его, чем нужно. Спасибо за помощь. - person Sravan Kumar Nerella; 17.03.2021