首页 > 解决方案 > Flutter Riverpod:StreamProvider/FutureProvider 组合的重建太多

问题描述

使用flutter_riverpod,给定以下提供者:

final s = StreamProvider.autoDispose<bool>((ref) async* {
  yield true;
});

final f = FutureProvider.autoDispose<bool>((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.autoDispose<bool>((ref) async* {
  yield true;
});

final f = FutureProvider.autoDispose<bool>((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');
  }
}

标签: flutterriverpod

解决方案


推荐阅读