You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 build
    
    或用watch模式实时生成:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 13:36:04