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

Flutter应用无法连接Supabase实时订阅问题求助

问题

基于Flutter和Supabase后端开发项目,需要订阅监听实时事件以获取数据库中新创建的Receipt对象。按Supabase文档步骤实现后,subscribe().canPush返回false,说明Socket未连接,但控制台无报错,且Supabase实时事件检查器中能看到事件触发。使用个人真机开发,怀疑是网络安全配置问题,寻求解决办法。

Supabase初始化代码:

await Supabase.initialize(
   url: '${dotenv.env['NEXT_PUBLIC_SUPABASE_URL']}', 
   anonKey: '${dotenv.env['NEXT_PUBLIC_SUPABASE_ANON_KEY']}',
   realtimeClientOptions: const RealtimeClientOptions(
   eventsPerSecond: 2,
  ), 
);

订阅方法代码:

final supabase = Supabase.instance.client;
final subscription = supabase
    .channel('Receipt')
    .onPostgresChanges(
        event: PostgresChangeEvent.all,
        schema: 'public',
        callback: (payload) {
          print('Change received: ${payload.toString()}');
        })
    .subscribe();

可能的解决方向

1. 配置真机网络安全策略

  • Android端:在android/app/src/main/res/xml/network_security_config.xml中添加Supabase域名的信任配置,允许WebSocket连接:

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <domain-config cleartextTrafficPermitted="false">
            <domain includeSubdomains="true">your-supabase-domain.supabase.co</domain>
        </domain-config>
    </network-security-config>
    

    并在AndroidManifest.xml的<application>标签中引用该配置:android:networkSecurityConfig="@xml/network_security_config"

  • iOS端:若使用HTTP协议(不推荐),需在Info.plist中添加ATS例外;若为HTTPS,确保Supabase官方证书受信任,真机无需额外操作(若为自签名证书需手动信任)。

2. 确认Supabase Realtime服务与表权限

  • 登录Supabase后台,进入对应项目的Realtime页面,确保public schema下的Receipt表已启用Realtime监听。
  • 检查anon用户对Receipt表的权限,需授予SELECT权限(实时监听依赖读取权限),可通过SQL编辑器执行:
    GRANT SELECT ON TABLE public.receipt TO anon;
    

3. 添加连接状态与错误监听

修改订阅代码,添加状态回调以排查连接问题:

final subscription = supabase
    .channel('Receipt')
    .onPostgresChanges(
        event: PostgresChangeEvent.insert, // 仅监听新增事件,缩小范围
        schema: 'public',
        table: 'receipt', // 明确指定表名,避免歧义
        callback: (payload) {
          print('New Receipt: ${payload.toString()}');
        })
    .subscribe((status, [error]) {
  if (error != null) {
    print('订阅错误: ${error.message}');
  }
  print('订阅状态: $status');
});

同时在初始化后监听全局连接状态:

Supabase.instance.client.realtime.onConnectionStateChange.listen((event) {
  print('Realtime连接状态: ${event.name}');
});

4. 检查Realtime客户端配置

  • 尝试移除RealtimeClientOptions中的eventsPerSecond配置,使用默认值测试是否影响连接。
  • 确认初始化时的url和anonKey正确无误,可临时硬编码值排除dotenv读取异常。

5. 测试真机网络环境

  • 先验证REST API连通性,排除基础网络问题:
    final response = await supabase.from('receipt').select('*').limit(1);
    print('REST API测试结果: $response');
    
    若REST请求正常,说明网络连通,问题集中在WebSocket层面;若失败,排查真机网络或DNS配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:47:43