Supabase结合Riverpod StreamProvider Family未捕获删除事件问题
问题原因和解决方法
1. 检查cities表的实时规则是否包含DELETE权限
去Supabase控制台的实时板块,找到cities表的实时规则,必须添加允许DELETE操作的规则,否则删除城市不会触发实时通知。示例规则:
CREATE POLICY "允许cities表的DELETE实时通知" ON public.cities FOR DELETE USING (true); -- 这里可以根据你的业务逻辑加权限限制,比如只允许操作自己创建的数据
如果没有这条规则,删除操作的实时事件根本发不出来,组件自然不会更新。
2. 显式指定Stream监听DELETE事件
虽然Supabase Dart客户端的stream方法默认监听所有事件,但有时候可能因为配置问题漏掉DELETE,直接在代码里显式声明监听所有事件(或单独指定DELETE):
修改你的streamProvider代码:
static final streamProvider = StreamProvider.autoDispose.family<List<City>, int>( (ref, stateId) { var streamBuilder = supabase .from('cities') .stream(primaryKey: ['id']) .eq('state_id', stateId) .on(RealtimeListenTypes.all); // 明确监听INSERT/UPDATE/DELETE所有事件 var stream = streamBuilder .map((data) => data.map((json) => City.fromMap(json)).toList()); return stream; }, );
3. 验证实时事件是否触发
在Supabase控制台的实时面板打开日志,执行删除城市操作后,看看有没有DELETE事件的日志输出。如果没日志,说明规则没配对;如果有日志但组件没更新,再检查Stream的映射逻辑有没有问题。
内容的提问来源于stack exchange,提问作者Ufder
相关产品推荐
相关产品推荐

