🧐

Supabase.instance.clientを使うプロバイダーを定義する

2024/06/07に公開

💫なぜできなかったのか

過去に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