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

使用Flutter Riverpod时出错:表达式无法作为函数调用

Flutter Riverpod 错误:"The expression doesn't evaluate to a function, so it can't be invoked" 修复方案

错误原因

出现该错误的核心原因有两点:

  1. Riverpod API 版本不匹配:代码中使用了旧版 Riverpod(1.x)的 watch 参数,但如果项目依赖的是 Riverpod 2.x,Consumer 的 builder 函数第二个参数已从 watch 方法改为 ref 对象,直接调用 watch(authUserProvider) 会导致获取到的不是预期的 AsyncValue 类型。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:52:47