前のページはこちら

SupaBaseで作ったFunctionをFlutterで呼び出してみます。RCP(Remote Procedure Call)とも呼ばれFlutterではその関数を用います。

APIの実体

左メニューの「API」タグをクリックすると、真ん中あたりに「Stored Procedures」という欄があり、追加した関数群も登録されています。

右上には関数の使い方も記載されて便利なのですが、現在はJavaScript用でまだDart用ものは書かれていないようです。

コード修正

supabase_repository.dartへのメソッド追加

supabase_repository.dartに、下記のCallSupabaseFunctionメソッドを追加してください。

  static Future<bool> CallSupabaseFunction() async {
    try {
      var supabase = Supabase.instance.client;
      final response = await supabase.rpc('join_table_get', params: {
        'year_number': 2000,
      }).execute();
      print(response.data);

      return true;
    } catch (e) {
      print(e.toString());
      return false;
    }
  }

auth_page_view.dartに呼び出しを書く

auth_page_view.dartの

_image == null ? Text('No image selected.') : Image.file(_image!),

の下に下記コードを追加します。

        const SizedBox(height: 30),
        ElevatedButton(
          onPressed: () async {
            SupabaseRepository.CallSupabaseFunction();
          },
          child: Text('クエリの呼び出し'),
        ),

実行

実行すると、クエリの呼び出しボタンがあるので押してみます。

そうすると、ログに文字列が出てきます。

解説

SupabaseのRCP呼び出しは下記コードとなります。

      final response = await supabase.rpc('join_table_get', params: {
        'year_number': 2000,
      }).execute();

supabase.rpc関数の第一引数には呼び出す関数名となり、第2引数は下記のように引数名と内容を記載していきます。(今回はパラメータが1つだけでした)

param:{'引数名':内容, '引数名':内容, '引数名':内容, ...}

エラーが無ければresponse.dataにデータが入ってきます。

(おまけ)JSONから取得

詳しいコーディングは割愛しますが、取得したデータをJSONから取り出す事も出来ました。

以前のDB編と同じようにsupabase_repositoryに下記クラスを定義します。

class GetGameData {
  int id = 0;
  String title = '';
  String genre = '';
  int year = 0;

  GetGameData.fromJson(Map<String, dynamic> json)
      : id = json['game_id'],
        genre = json['game_genre_name'],
        title = json['game_name'],
        year = json['game_release_year'];
}

その後、await supabase.rpcの後に下記コードを追加、

      List<GetGameData> getGameDatas = [];

      (response.data as List).forEach((element) {
        var getgamedata = GetGameData.fromJson(element);
        getGameDatas.add(getgamedata);
      });

      print(getGameDatas[1].title);

これで、ゲームタイトルが表示される事を確認しました。

次のページはこちら