supabase_flutter

Flutter 包,用于 Supabase

pub package
pub test


Supabase 是什么

Supabase 是一个开源的 Firebase 替代品。我们是一个提供

  • 监听数据库更改
  • 查询您的表,包括过滤、分页和深度嵌套的关系(如 GraphQL)
  • 创建、更新和删除行
  • 管理您的用户及其权限
  • 通过简单的 UI 与数据库进行交互

状态

  • Alpha:开发中
  • 公开 Alpha:可供测试。但请对我们宽容些,会有 bug 和缺失的功能。
  • 公开 Beta:稳定。此版本预计不会有破坏性更改,但可能存在 bug。
  • 公开:生产就绪

功能

  • Null-safety(空安全)
平台 邮件认证 提供商认证 数据库 实时 存储
Android
iOS
macOS
Windows
Linux

入门

导入包

import 'package:supabase_flutter/supabase_flutter.dart';

在使用 Supabase 之前先初始化它

import 'package:supabase_flutter/supabase_flutter.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Supabase.initialize(
    url: SUPABASE_URL,
    anonKey: SUPABASE_ANNON_KEY,
    authCallbackUrlHostname: 'login-callback', // optional
    debug: true // optional
  );

  runApp(MyApp());
}

authCallbackUrlHostname 是可选的。它将用于过滤 Supabase 认证重定向的深层链接。如果您在应用中使用深层链接的其他功能,则需要提供此参数。

debug 是可选的。如果您在调试模式下运行应用(flutter run --debug),则默认启用它。

认证

可以轻松使用身份验证。

邮件身份验证

import 'package:supabase_flutter/supabase_flutter.dart';

Future<void> signIn(String email, String password) async {
  final response = await Supabase.instance.client.auth.signIn(email: email, password: password);
  if (response.error != null) {
    /// Handle error
  } else {
    /// Sign in with success
  }
}

SupabaseAuthState

它帮助您处理来自 Google、Github、Twitter 等第三方服务的身份验证(通过深层链接)。

更多详情,请查看此处的示例 示例

当与嵌套的身份验证流程一起使用时,请记住在导航到新屏幕之前/之后调用 startAuthObserver()stopAuthObserver(),以防止多个观察者同时运行。在此处的示例 示例 中查看。

SupabaseAuthRequiredState

它有助于保护需要已认证用户的路由。

更多详情,请查看此处的示例 示例

signInWithProvider

此方法将自动启动认证 URL,并打开浏览器供用户使用第三方登录进行登录。

Supabase.instance.client.auth.signInWithProvider(
  Provider.github,
  options: supabase.AuthOptions(redirectTo: ''),
);

自定义本地存储

默认情况下,supabase_flutter 使用 hive 插件来持久化用户会话。但是,您可以通过创建 LocalStorage 实现来使用任何其他插件。

例如,我们可以使用 flutter_secure_storage 插件将用户会话存储在安全存储中。

// Define the custom LocalStorage implementation
class SecureLocalStorage extends LocalStorage {
  SecureLocalStorage() : super(
    initialize: () async {},
    hasAccessToken: () {
      const storage = FlutterSecureStorage();
      return storage.containsKey(key: supabasePersistSessionKey);
    }, accessToken: () {
      const storage = FlutterSecureStorage();
      return storage.read(key: supabasePersistSessionKey);
    }, removePersistedSession: () {
      const storage = FlutterSecureStorage();
      return storage.delete(key: supabasePersistSessionKey);
    }, persistSession: (String value) {
      const storage = FlutterSecureStorage();
      return storage.write(key: supabasePersistSessionKey, value: value);
    },
  );
}

// use it when initializing
Supabase.initialize(
  ...
  localStorage: SecureLocalStorage(),
);

您可以使用 EmptyLocalStorage 来禁用会话持久化。

Supabase.initialize(
  // ...
  localStorage: const EmptyLocalStorage(),
);

Deeplink 配置

Supabase 重定向 URL 配置

  • 转到您的 Supabase 项目的身份验证设置页面。
  • 您需要在“附加重定向 URL”字段中输入您的应用重定向回调。

重定向回调 URL 应具有以下格式:[您的SCHEME]://[您的认证主机名]

authentication settings page

Supabase 第三方登录配置

请遵循指南 https://supabase.io/docs/guides/auth#third-party-logins

对于 Android

深层链接可以具有任何自定义方案。缺点是任何应用程序都可以声明一个方案,因此请确保您的方案尽可能独特,例如 HST0000001://host.com

<manifest ...>
  <!-- ... other tags -->
  <application ...>
    <activity ...>
      <!-- ... other tags -->

      <!-- Deep Links -->
      <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with YOUR_SCHEME://YOUR_HOST -->
        <data
          android:scheme="[YOUR_SCHEME]"
          android:host="[YOUR_HOST]" />
      </intent-filter>
    </activity>
  </application>
</manifest>

对于深度链接,android:host 属性是可选的。

更多信息:https://developer.android.com.cn/training/app-links/deep-linking

对于 iOS

自定义 URL 方案可以具有……任何自定义方案,并且没有主机特异性、权利或许可文件。缺点是任何应用程序都可以声明任何方案,因此请确保您的方案尽可能独特,例如 hst0000001myIncrediblyAwesomeScheme

对于自定义 URL 方案,您需要在
ios/Runner/Info.plist(或通过 Xcode 的 Target Info 编辑器,
在 URL Types 下)进行声明

<!-- ... other tags -->
<plist>
<dict>
  <!-- ... other tags -->
  <key>CFBundleURLTypes</key>
  <array>
    <dict>
      <key>CFBundleTypeRole</key>
      <string>Editor</string>
      <key>CFBundleURLSchemes</key>
      <array>
        <string>[YOUR_SCHEME]</string>
      </array>
    </dict>
  </array>
  <!-- ... other tags -->
</dict>
</plist>

这使得您的应用程序可以通过 您的 SCHEME://ANYTHING 链接启动。

更多信息:https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app


贡献

  • GitHub 上 fork 该仓库
  • 将项目克隆到您自己的机器
  • 将更改提交到您自己的分支
  • 将您的工作推送到您的 fork
  • 提交拉取请求,以便我们审查您的更改并合并

许可证

此仓库根据 MIT 许可。

GitHub

查看 Github