Flutter数据库扩展插件supabase_extensions的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter数据库扩展插件supabase_extensions的使用

简介

supabase_extensions 是一个对 Supabase API 的扩展,提供了一些便捷的方法来简化与数据库的交互。

特性

  • 使用SQL语句字符串从Supabase(使用PostgREST)获取结果。
  • 尽可能简短的语法。
  • 更简单的方式监听数据库中的变化。

注意: 目前仅支持Select/Insert SQL语句(仍在开发中)。

开始使用

要在您的应用程序中使用它,请导入以下包:

import 'package:supabase_extensions/base.dart';

用法示例

使用SQL查询获取数据
// 初始化 Supabase 客户端
final supabase = SupabaseClient('supabaseUrl', 'supabaseKey');

const sqlString = 'SELECT code FROM courses WHERE code > 32000 ORDER BY code LIMIT 2';
QueryResults queryResults = await supabase.sql(sqlString);

List<Map<String, dynamic>> rows = queryResults.rows; // 获取查询结果
获取用户ID
// 初始化 Supabase 客户端
final supabase = SupabaseClient('supabaseUrl', 'supabaseKey');

String? userId = supabase.uid;  /// 替代 supabase.auth.currentUser?.id
检查用户是否已登录
// 初始化 Supabase 客户端
final supabase = SupabaseClient('supabaseUrl', 'supabaseKey');

bool isLoggedIn = supabase.isLogged;  /// 替代 supabase.auth.currentUser?.id != null
获取用户的访问令牌
// 初始化 Supabase 客户端
final supabase = SupabaseClient('supabaseUrl', 'supabaseKey');

String? accessToken = supabase.jwt;  /// 替代 supabase.auth.currentSession?.accessToken
监听数据库表的变化
// 初始化 Supabase 客户端
final supabase = SupabaseClient('supabaseUrl', 'supabaseKey');

// 监听所有事件
supabase.from('test').stream(primaryKey: ['id']).listen((event) {
    print(event);
});

// 仅监听 INSERT 事件
supabase.on('table', CrudEvent.insert).listen((event) {
    print(event);
});

// 更简短的语法监听 INSERT 和 DELETE 事件
supabase.onInsert('table').listen((event) {
  print(event);
});
supabase.onDelete('table').listen((event) {
  print(event);
});

注意: 记得在完成后移除通道并关闭流。

supabase.removeAllChannels();
supabase.closeAllStreams();   // 添加这行!
获取当前登录用户的提供商名称
// 初始化 Supabase 客户端
final supabase = SupabaseClient('supabaseUrl', 'supabaseKey');

String? providerName = supabase.auth.provider; /// 替代 supabase.auth.provider

完整示例 Demo

import 'package:supabase/supabase.dart';
import 'package:supabase_extensions/src/base.dart';
import 'package:supabase_extensions/src/query_results.dart';
import 'package:dotenv/dotenv.dart';
import 'package:supabase_extensions/src/supabase_auth_ext.dart';

void main() async {
  // 初始化 Supabase 客户端
  var env = DotEnv(includePlatformEnvironment: true)..load();
  final String SUPABASE_URL = env['SUPABASE_URL']!;
  final String SUPABASE_ANNON_KEY = env['SUPABASE_ANNON_KEY']!;

  final supabase = SupabaseClient(SUPABASE_URL, SUPABASE_ANNON_KEY);

  var userId = "dcde0dba-f759-4700-84a2-5534aadaaf54";

  // 使用SQL查询获取数据
  var results = await supabase
      .sql("select * from user_constraints where user_id = '$userId'");
  print(results.rows ?? []);

  // 获取当前登录用户的提供商名称
  final providerName = supabase.auth.provider;

  // 监听数据库表的变化
  supabase.from('test').stream(primaryKey: ['id']).listen((event) {
    print(event);
  });

  supabase.on('test', CrudEvent.insert).listen((event) {
    print(event);
  });

  supabase.onInsert('test').listen((event) {
    print(event);
  });

  // 记得在完成后移除通道并关闭流
  supabase.removeAllChannels();
  supabase.closeAllStreams();

  // 使用SQL查询获取数据
  QueryResults data = await supabase.sql(
      "select last_data from saved_schedules where user_id = '6bce5d00-5365-4d44-a33b-089ee431161b'");
  print(data.rows);

  await Future.delayed(Duration(seconds: 100));
}

更多关于Flutter数据库扩展插件supabase_extensions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据库扩展插件supabase_extensions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用supabase_extensions插件的示例代码。这个插件允许你使用Supabase的扩展功能,这些扩展功能提供了额外的数据库操作和计算功能。

首先,你需要确保已经在Flutter项目中添加了supabase_dartsupabase_extensions依赖。在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  supabase_dart: ^0.5.0  # 请检查最新版本
  supabase_extensions: ^0.1.0  # 请检查最新版本

然后运行flutter pub get来安装这些依赖。

接下来,设置Supabase客户端并配置扩展。以下是一个简单的示例代码,展示了如何使用supabase_extensions插件:

import 'package:flutter/material.dart';
import 'package:supabase_dart/supabase_dart.dart';
import 'package:supabase_extensions/supabase_extensions.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Supabase Extensions Example'),
        ),
        body: Center(
          child: SupabaseExtensionsExample(),
        ),
      ),
    );
  }
}

class SupabaseExtensionsExample extends StatefulWidget {
  @override
  _SupabaseExtensionsExampleState createState() => _SupabaseExtensionsExampleState();
}

class _SupabaseExtensionsExampleState extends State<SupabaseExtensionsExample> {
  late SupabaseClient supabaseClient;
  late ExtensionsClient extensionsClient;

  @override
  void initState() {
    super.initState();
    // 初始化Supabase客户端
    String supabaseUrl = 'YOUR_SUPABASE_URL';
    String supabaseAnonKey = 'YOUR_SUPABASE_ANON_KEY';
    supabaseClient = SupabaseClient(supabaseUrl, supabaseAnonKey);
    extensionsClient = ExtensionsClient(supabaseClient);
  }

  void callExtension() async {
    try {
      // 假设你有一个名为 'example_extension' 的扩展
      // 并且这个扩展需要一个参数 'input'
      Map<String, dynamic> payload = {
        'input': 'Hello, Supabase Extensions!',
      };

      // 调用扩展
      var response = await extensionsClient.rpc('example_extension', payload);

      // 打印响应
      print('Extension response: ${response.data}');
    } catch (error) {
      print('Error calling extension: $error');
    }
  }

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: callExtension,
      child: Text('Call Extension'),
    );
  }
}

在这个示例中:

  1. 我们首先初始化了SupabaseClientExtensionsClient
  2. 我们定义了一个名为callExtension的异步函数,它调用名为example_extension的Supabase扩展,并传递一个包含input字段的payload。
  3. 在按钮的onPressed回调中,我们调用了callExtension函数。

请注意,你需要将YOUR_SUPABASE_URLYOUR_SUPABASE_ANON_KEY替换为你自己的Supabase项目URL和匿名密钥。此外,确保你的Supabase项目中已经部署了名为example_extension的扩展,并且这个扩展接受一个名为input的参数。

这个示例提供了一个基本框架,你可以根据具体的需求和扩展的API文档来调整和扩展代码。

回到顶部