🧐
Supabase.instance.clientを使うプロバイダーを定義する
💫なぜできなかったのか
過去にSupabaseのインスタンスを使えるプロバイダーを作ろうとしたができないことがあった???
なぜかこんな変コードで当時対応したことがある!
// Supabaseをインスタンス化するプロバイダー.
final notesProvider = StateProvider<SupabaseClient>((ref) {
return Supabase.instance.client;
});
でもできるようだ...
final sc = Provider((ref) {
return Supabase.instance.client;
});
final us = StreamProvider.autoDispose((ref) {
return ref.watch(sc).from('users').asStream();
});
エラー出てない?
プロバイダーにautoDispose
書いてますが、上のコードからは消してます。
自動生成するコードだとこうなる
SupabaseClinet Instance
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
part 'supabase.g.dart';
(keepAlive: true)
SupabaseClient supabaseClient(SupabaseClientRef ref) {
return Supabase.instance.client;
}
StreamProvider
import 'package:follower_app/entity/user.dart';
import 'package:follower_app/infrastructure/supabase.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'user.g.dart';
Stream<List<UserState>> user(UserRef ref) async* {
List<UserState> data = [];
final response = ref.read(supabaseClientProvider);
final stream = response.from('users').asStream();
await for (final item in stream) {
data.add(UserState.fromJson(item));
yield data;
}
}
まとめ
当時対応してなかったのかもしれないし私のコードの書き方が良くなかったのかもしれない?
シングルトンだからできないとか、AIが言っていたような...
問題なさそうだから、今度からはプロバイダーで書くようにしよう。
Discussion