Flutter中如何正确使用Riverpod的Future<>示例?
Riverpod Future 示例错误解决方案
问题1:Undefined class 'BoredSuggestionRef'
这个错误是因为使用@riverpod注解后,对应的Ref类未被代码生成工具自动生成,解决步骤如下:
- 确认依赖配置正确,在
pubspec.yaml中添加:dependencies: riverpod: ^2.3.0 riverpod_annotation: ^2.1.0 dev_dependencies: build_runner: ^2.4.0 riverpod_generator: ^2.3.0 - 执行代码生成命令,在终端运行:
或用dart run build_runner buildwatch模式实时生成:dart run build_runner watch - 在定义Provider的文件中导入生成的
.g.dart文件,比如你的Provider文件是bored_provider.dart,需添加:import 'bored_provider.g.dart';
正确的注解式FutureProvider示例:
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'bored_provider.g.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; part 'bored_provider.g.dart'; @riverpod Future<String> boredSuggestion(BoredSuggestionRef ref) async { final response = await http.get( Uri.parse('https://www.boredapi.com/api/activity'), ); final data = jsonDecode(response.body) as Map<String, dynamic>; return data['activity'] as String; }
问题2:The method 'when' isn't defined for the type 'Future'
when方法是AsyncValue类的专属方法,StateProvider仅用于管理同步状态,无法直接处理Future。需使用专门的异步状态Provider:FutureProvider或AsyncNotifierProvider。
用FutureProvider实现的简单示例
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; final boredSuggestionProvider = FutureProvider<String>((ref) async { final response = await http.get( Uri.parse('https://www.boredapi.com/api/activity'), ); final data = jsonDecode(response.body) as Map<String, dynamic>; return data['activity'] as String; }); // 在Widget中调用 class BoredWidget extends ConsumerWidget { const BoredWidget({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final boredSuggestion = ref.watch(boredSuggestionProvider); return boredSuggestion.when( loading: () => const CircularProgressIndicator(), error: (error, stack) => Text('Error: $error'), data: (activity) => Text('Suggestion: $activity'), ); } }
用注解式AsyncNotifierProvider实现(支持状态刷新)
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'bored_notifier.g.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; part 'bored_notifier.g.dart'; @riverpod class BoredSuggestion extends _$BoredSuggestion { @override Future<String> build() async { return fetchActivity(); } Future<String> fetchActivity() async { final response = await http.get( Uri.parse('https://www.boredapi.com/api/activity'), ); final data = jsonDecode(response.body) as Map<String, dynamic>; return data['activity'] as String; } // 添加刷新方法 Future<void> refresh() async { state = const AsyncValue.loading(); state = await AsyncValue.guard(fetchActivity); } } // 在Widget中调用 class BoredWidget extends ConsumerWidget { const BoredWidget({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final boredSuggestion = ref.watch(boredSuggestionProvider); return Column( children: [ boredSuggestion.when( loading: () => const CircularProgressIndicator(), error: (error, stack) => Text('Error: $error'), data: (activity) => Text('Suggestion: $activity'), ), ElevatedButton( onPressed: () => ref.read(boredSuggestionProvider.notifier).refresh(), child: const Text('Refresh'), ), ], ); } }
内容的提问来源于stack exchange,提问作者chichi
相关产品推荐
相关产品推荐

