使用Flutter Riverpod时出错:表达式无法作为函数调用
Flutter Riverpod 错误:"The expression doesn't evaluate to a function, so it can't be invoked" 修复方案
错误原因
出现该错误的核心原因有两点:
- Riverpod API 版本不匹配:代码中使用了旧版 Riverpod(1.x)的
watch参数,但如果项目依赖的是 Riverpod 2.x,Consumer 的 builder 函数第二个参数已从watch方法改为ref对象,直接调用watch(authUserProvider)会导致获取到的不是预期的AsyncValue类型。 - Provider 类型错误:如果
authUserProvider定义为普通Provider(而非FutureProvider/StreamProvider/AsyncNotifierProvider等异步类型),它返回的对象不包含when方法,调用currentUser.when()自然会报错。
修复步骤
步骤1:适配 Riverpod 2.x API(若使用新版本)
将 Consumer 的 builder 函数中的 watch 参数替换为 ref,通过 ref.watch() 监听 provider。
步骤2:确保 authUserProvider 为异步类型
在 providers.dart 中,将 authUserProvider 定义为 FutureProvider(或其他异步 provider 类型),确保返回 AsyncValue 类型,这样才能调用 when 方法处理状态。
示例 providers.dart 代码:
import 'package:amplify_auth_cognito/amplify_auth_cognito.dart'; import 'package:amplify_flutter/amplify_flutter.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; final authUserProvider = FutureProvider<User?>((ref) async { try { final user = await Amplify.Auth.getCurrentUser(); return user; } on AuthException catch (_) { return null; } });
步骤3:修正主代码中的 Consumer 逻辑
修改后的 App 组件代码:
import 'package:amplify_auth_cognito/amplify_auth_cognito.dart'; import 'package:amplify_flutter/amplify_flutter.dart'; import 'package:fitmassdesktop/amplifyconfiguration.dart'; import 'package:fitmassdesktop/pages/home.dart'; import 'package:fitmassdesktop/pages/login.dart'; import 'package:fitmassdesktop/providers.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; class App extends StatefulWidget { const App({super.key}); @override State<App> createState() => _AppState(); } class _AppState extends State<App> { bool _amplifyConfigured = false; String? _configureError; @override void initState() { super.initState(); _configureAmplify(); } Future<void> _configureAmplify() async { try { await Amplify.addPlugins([AmplifyAuthCognito()]); await Amplify.configure(amplifyconfig); setState(() { _amplifyConfigured = true; }); } on AmplifyAlreadyConfiguredException catch (_) { setState(() => _amplifyConfigured = true); } catch (e) { setState(() { _configureError = e.toString(); _amplifyConfigured = false; }); } } @override Widget build(BuildContext context) { return MaterialApp( home: _amplifyConfigured ? Consumer( builder: (context, ref, child) { final currentUser = ref.watch(authUserProvider); return currentUser.when( data: (data) => data == null ? const LoginPage() : const HomePage(), loading: () => const Center(child: CircularProgressIndicator()), error: (e, st) => const LoginPage(), ); }, ) : _configureError != null ? Center(child: Text('配置失败:$_configureError')) : const Center(child: CircularProgressIndicator()), ); } }
额外说明
- 新增 Amplify 配置的异常处理,避免配置失败后直接跳转 HomePage 的问题。
- 将
CircularProgressIndicator包裹在Center组件中,确保显示在屏幕中央。
内容的提问来源于stack exchange,提问作者Matheus Viezi
相关产品推荐
相关产品推荐

