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

Flutter集成Supabase Auth注册报错:需提供asyncStorage完成PKCE流程

解决Supabase认证报错:You need to provide asyncStorage to perform pkce flow

这个错误的核心原因很明确:你的SupabaseClient实例没有配置异步存储(asyncStorage),而PKCE(授权码流程的安全扩展)需要用它来存储认证过程中的临时数据(比如state、code_verifier),所以触发了断言检查失败。

最直接的解决方案:使用官方初始化方式(推荐)

你当前手动创建SupabaseClient的方式跳过了supabase_flutter提供的默认配置,正确的做法是在App启动时通过Supabase.initialize完成全局初始化,它会自动帮你配置好适配平台的安全异步存储。

  1. 修改main.dart,在启动时初始化Supabase:
import 'package:flutter/material.dart';
import 'package:supabase_flutter/supabase_flutter.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // 替换成你的Supabase URL和Anon Key
  await Supabase.initialize(
    url: 'https://your-project.supabase.co',
    anonKey: 'your-anon-key-here',
  );
  runApp(const MyApp());
}
  1. 调整你的SupabaseClientService(或直接使用全局实例):
    如果仍想用单例封装,可以改成依赖全局初始化后的实例:
import 'package:supabase_flutter/supabase_flutter.dart';

class SupabaseClientService {
  final SupabaseClient client;

  SupabaseClientService._internal() : client = Supabase.instance.client;

  static final SupabaseClientService instance = SupabaseClientService._internal();
}

备选方案:手动配置asyncStorage(不推荐)

如果你坚持手动创建SupabaseClient,需要自己实现并传入asyncStorage参数。以SharedPreferences为例:

  1. 先添加shared_preferences依赖到pubspec.yaml
  2. 实现AsyncStorage接口并传入:
import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';

class SupabaseClientService {
  final SupabaseClient client;

  // 注意:异步初始化需调整单例创建逻辑
  static Future<SupabaseClientService> getInstance() async {
    final prefs = await SharedPreferences.getInstance();
    return SupabaseClientService._internal(prefs);
  }

  SupabaseClientService._internal(SharedPreferences prefs)
      : client = SupabaseClient(
            'https://your-project.supabase.co',
            'your-anon-key-here',
            asyncStorage: _SharedPrefsStorage(prefs),
          );
}

// 实现AsyncStorage接口
class _SharedPrefsStorage extends AsyncStorage {
  final SharedPreferences _prefs;

  _SharedPrefsStorage(this._prefs);

  @override
  Future<String?> getItem(String key) => Future.value(_prefs.getString(key));

  @override
  Future<void> removeItem(String key) => _prefs.remove(key);

  @override
  Future<void> setItem(String key, String value) => _prefs.setString(key, value);
}

为什么之前的代码会报错?

你手动实例化SupabaseClient时,没有传入asyncStorage参数,而Supabase默认使用PKCE流程处理邮箱/密码认证,这个流程必须依赖异步存储来保存临时验证数据,因此触发了断言错误。

修改完成后,再调用signUp方法就不会再出现这个错误了。

内容的提问来源于stack exchange,提问作者seyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 02:15:08