#flutter #riverpod
Вопрос:
Используя flutter_riverpod
, учитывая следующих поставщиков:
final s = StreamProvider.autoDisposelt;boolgt;((ref) async* { yield true; }); final f = FutureProvider.autoDisposelt;boolgt;((ref) async { final source = await ref.watch(s.last); print('Stream value received: $source'); return source; });
Когда f
на него ссылаются из a Widget
, он дважды напечатает сообщение, т. Е. Дважды перестроится, даже если поток, на который ссылаются StreamProvider
, выдает только одно значение.
Stream value received: true Stream value received: true
Это почему? Как я могу быть уверен, что мой FutureProvider
будет выполняться только один раз для каждого значения потока?
Вот полный минимальный код для воспроизведения проблемы:
import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; final s = StreamProvider.autoDisposelt;boolgt;((ref) async* { yield true; }); final f = FutureProvider.autoDisposelt;boolgt;((ref) async { final source = await ref.watch(s.last); print('Stream value received: $source'); return source; }); void main() { runApp(ProviderScope(child: (MyApp()))); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( theme: ThemeData.light(), debugShowCheckedModeBanner: false, home: Scaffold( body: Center( child: MyWidget(), ), ), ); } } class MyWidget extends ConsumerWidget { @override Widget build(BuildContext context, ScopedReader watch) { watch(f); return const Text('hi'); } }
Комментарии:
1. Не уверен, была ли это ошибка, но я использую riverpod: ^1.0.0-dev.10, и он печатается только один раз.