Flutter riverpod: слишком много перестроек для комбинации StreamProvider/FutureProvider

#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, и он печатается только один раз.