🕶️

[Flutter✖️Supabase]Riverpod周りで詰まった話

2025/03/09に公開2

Supabaseでプロバイダー使えない!?

SupabaseProviderを以下のように作成をし、service層で呼び出しをしたところエラーが発生しました。

import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
part 'provider.g.dart';

(keepAlive: true)
SupabaseClient supabaseProvider(ref) {
  return Supabase.instance.client;
}
エラー
type '(dynamic) => SupabaseClient' is not a subtype of type 'ProviderListenable<dynamic>' of 'provider'

調べたところによるとsupabaseはProviderを必要としないことが判明しました。
つまりグローバルに扱えるインスタンス変数を定義してやるだけで良いことが判明しました。
えっ!!ってなりますよね。なりました。だってfirebaseだとfireStoreProviderとかを定義することが多いので衝撃ですよね。
ということで以下のように定義してやるだけで良さそうです。

./lib/supabase/supabase.dart
import 'package:supabase_flutter/supabase_flutter.dart';

/// supabaseのインスタンス
final supabase = Supabase.instance.client;

参考

https://zenn.dev/joo_hashi/articles/83f65608fb370f

Discussion

JboyHashimotoJboyHashimoto

いやーでも案件でやっときできたんですよね。

// Package imports:
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:supabase_flutter/supabase_flutter.dart';

part 'supabase_provider.g.dart';

// 2.6.0~以降
(keepAlive: true)
SupabaseClient supabaseClient(Ref ref) {
  return Supabase.instance.client;
}

コツがいるのでしょう。色々試してみてください。
https://zenn.dev/koichi_51/articles/2cc5ea540254d1#2.-flutter-側の準備

JboyHashimotoJboyHashimoto

あああこれ間違ってますね。Refがぬけてますね。
上のは、(Ref ref)
昔のは、(SupabaseRef ref)

import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
part 'provider.g.dart';

(keepAlive: true)
// (ref)しかない。
SupabaseClient supabaseProvider(ref) {
  return Supabase.instance.client;
}