从预填充的Supabase表获取数据返回空数组求助
Supabase Realtime流返回空数据的解决方法
问题描述
首次使用Supabase Realtime,希望实时访问表中数据并通过应用交互更新数据。已在Supabase中预填充数据库,但调用流获取数据时返回空数组,控制台输出[]。
数据库设置截图:
使用的Dart代码:
class _TrackerState extends State<Tracker> { @override Widget build(BuildContext context) { final SupabaseClient supabase = Supabase.instance.client; final stream = supabase.from('Counter').stream(primaryKey: ["name"]); return Scaffold( appBar: ... ), body: Center( child: StreamBuilder( stream: stream, builder: (context, snapshot) { switch (snapshot.connectionState) { case ConnectionState.active: if (snapshot.hasError) log(snapshot.error.toString()); log(snapshot.data.toString()); final data = snapshot.data as List<dynamic>; return ... default: return const Scaffold( body: Center( child: SizedBox( child: CircularProgressIndicator(), ), )); } }, ), ), ); } }
解决步骤
检查Realtime服务状态
进入Supabase控制台对应项目,打开Database->Realtime页面,确认Counter表的Realtime服务已开启,且至少勾选SELECT权限(用于读取数据)。验证主键配置
代码中指定了primaryKey: ["name"],需确保Counter表的name字段是主键(或复合主键的一部分)。可在Database->Tables->Counter表的Columns页面查看主键设置,若name不是主键,需修改主键配置或调整代码中的primaryKey参数。检查行级安全(RLS)策略
若Counter表启用了RLS,需确保存在允许当前用户读取数据的策略:- 前往
Database->Tables->Counter表的Policies页面,查看现有策略; - 可临时添加测试策略:
CREATE POLICY "允许所有用户读取Counter表" ON "public"."Counter" FOR SELECT USING (true);,测试是否能获取数据; - 若不需要RLS,可暂时关闭该功能,排查是否为策略导致的问题。
- 前往
确认表名大小写一致
PostgreSQL默认区分大小写,确保代码中的表名Counter与数据库中实际表名完全一致(包括大小写),若数据库中是小写counter,代码需同步修改。测试基础查询
在initState中添加普通查询测试,确认数据本身可被读取:@override void initState() { super.initState(); supabase.from('Counter').select().then((value) { log('普通查询结果: $value'); }); }若普通查询也返回空,说明问题不在Realtime流,需排查数据权限、表名匹配等基础问题;若普通查询有数据,再聚焦Realtime配置。
内容的提问来源于stack exchange,提问作者Sunken In Time
相关产品推荐
相关产品推荐

