Flutter数据库交互插件supabase_repository的使用

Flutter数据库交互插件supabase_repository的使用

使用supabase_repository插件可以方便地将Supabase集成到Dart项目中。以下是详细的安装和使用说明。

如何安装

在你的pubspec.yaml文件中添加以下依赖:

dart pub add supabase_repository

如何使用

首先,确保你已经获得了Supabase的URL和API密钥。然后,你可以按照以下步骤进行配置:

import 'package:database_repository/database_repository.dart';
import 'package:supabase_repository/supabase_repository.dart';

void main() {
    // 替换为你的Supabase安装URL
    final String mySupabaseUrl = "https://your-supabase-url.supabase.co";
    // 替换为你的Supabase API密钥
    final String mySupabaseKey = "your-supabase-api-key";

    // 创建Supabase数据库适配器实例
    final DatabaseAdapter myDatabaseAdapter = SupabaseDatabaseAdapter(
        supabaseInstallationUrl: mySupabaseUrl,
        supabaseApiKey: mySupabaseKey
    );

    // 注册你想要使用的数据库适配器
    DatabaseAdapterRegistry.register(myDatabaseAdapter);

    // 创建数据库仓库实例
    final repository = DatabaseRepository.fromRegistry(serializer: mySerializer, name: 'supabase');

    // 现在可以使用create()等方法
    // 示例:创建一条记录
    repository.create('users', {'name': 'John Doe', 'email': 'john.doe@example.com'});
}

完整示例Demo

以下是一个完整的示例代码,展示了如何使用supabase_repository插件与Supabase进行数据库交互:

import 'package:database_repository/database_repository.dart';
import 'package:supabase_repository/supabase_repository.dart';

void main() async {
    // 替换为你的Supabase安装URL
    final String mySupabaseUrl = "https://your-supabase-url.supabase.co";
    // 替换为你的Supabase API密钥
    final String mySupabaseKey = "your-supabase-api-key";

    // 创建Supabase数据库适配器实例
    final DatabaseAdapter myDatabaseAdapter = SupabaseDatabaseAdapter(
        supabaseInstallationUrl: mySupabaseUrl,
        supabaseApiKey: mySupabaseKey
    );

    // 注册你想要使用的数据库适配器
    DatabaseAdapterRegistry.register(myDatabaseAdapter);

    // 创建数据库仓库实例
    final repository = DatabaseRepository.fromRegistry(serializer: mySerializer, name: 'supabase');

    // 示例:创建一条记录
    await repository.create('users', {'name': 'John Doe', 'email': 'john.doe@example.com'});

    // 示例:读取一条记录
    final record = await repository.read('users', id: 'some-record-id');
    print(record);

    // 示例:更新一条记录
    await repository.update('users', id: 'some-record-id', data: {'email': 'new-email@example.com'});

    // 示例:删除一条记录
    await repository.delete('users', id: 'some-record-id');
}

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

1 回复

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


supabase_repository 是一个用于简化 Flutter 应用与 Supabase 数据库交互的插件。它提供了一种方便的方式来处理 Supabase 的认证、数据库操作和实时订阅等功能。以下是使用 supabase_repository 插件的基本步骤和示例。

1. 安装依赖

首先,在 pubspec.yaml 文件中添加 supabase_repository 依赖:

dependencies:
  flutter:
    sdk: flutter
  supabase_flutter: ^1.0.0
  supabase_repository: ^0.1.0

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

2. 初始化 Supabase

在使用 supabase_repository 之前,你需要初始化 Supabase 客户端。通常在 main.dart 中完成:

import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:supabase_repository/supabase_repository.dart';

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

  await Supabase.initialize(
    url: 'https://your-supabase-url.supabase.co',
    anonKey: 'your-anon-key',
  );

  runApp(MyApp());
}

3. 创建 Repository

supabase_repository 提供了一个 SupabaseRepository 类,你可以继承它来创建自定义的 Repository 类,用于处理特定的数据库操作。

import 'package:supabase_repository/supabase_repository.dart';

class UserRepository extends SupabaseRepository {
  UserRepository() : super('users'); // 'users' 是你要操作的 Supabase 表名

  // 添加自定义方法
  Future<List<Map<String, dynamic>>> getActiveUsers() async {
    return await supabase
        .from(tableName)
        .select()
        .eq('is_active', true)
        .execute()
        .then((response) => response.data);
  }
}

4. 使用 Repository

在你的应用中使用 UserRepository 来进行数据库操作:

import 'package:flutter/material.dart';
import 'user_repository.dart';

class UserListScreen extends StatefulWidget {
  @override
  _UserListScreenState createState() => _UserListScreenState();
}

class _UserListScreenState extends State<UserListScreen> {
  final UserRepository _userRepository = UserRepository();
  List<Map<String, dynamic>> _users = [];

  @override
  void initState() {
    super.initState();
    _loadUsers();
  }

  Future<void> _loadUsers() async {
    final users = await _userRepository.getActiveUsers();
    setState(() {
      _users = users;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Active Users'),
      ),
      body: ListView.builder(
        itemCount: _users.length,
        itemBuilder: (context, index) {
          final user = _users[index];
          return ListTile(
            title: Text(user['name']),
            subtitle: Text(user['email']),
          );
        },
      ),
    );
  }
}

5. 处理实时更新

supabase_repository 还支持实时订阅功能。你可以使用 RealtimeSubscription 来监听数据库的变化:

import 'package:supabase_repository/supabase_repository.dart';

class UserRepository extends SupabaseRepository {
  UserRepository() : super('users');

  Stream<List<Map<String, dynamic>>> getActiveUsersStream() {
    return supabase
        .from(tableName)
        .stream(['id']) // 监听 'id' 列的变化
        .eq('is_active', true)
        .map((snapshot) => snapshot.map((data) => data as Map<String, dynamic>).toList());
  }
}

然后在你的 UI 中使用 StreamBuilder 来显示实时更新的数据:

import 'package:flutter/material.dart';
import 'user_repository.dart';

class UserListScreen extends StatelessWidget {
  final UserRepository _userRepository = UserRepository();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Active Users'),
      ),
      body: StreamBuilder<List<Map<String, dynamic>>>(
        stream: _userRepository.getActiveUsersStream(),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return Center(child: CircularProgressIndicator());
          } else if (snapshot.hasError) {
            return Center(child: Text('Error: ${snapshot.error}'));
          } else if (!snapshot.hasData || snapshot.data!.isEmpty) {
            return Center(child: Text('No active users found.'));
          } else {
            final users = snapshot.data!;
            return ListView.builder(
              itemCount: users.length,
              itemBuilder: (context, index) {
                final user = users[index];
                return ListTile(
                  title: Text(user['name']),
                  subtitle: Text(user['email']),
                );
              },
            );
          }
        },
      ),
    );
  }
}

6. 处理认证

supabase_repository 也提供了对 Supabase 认证的支持。你可以使用 SupabaseAuthRepository 来处理用户认证:

import 'package:supabase_repository/supabase_repository.dart';

class AuthService {
  final SupabaseAuthRepository _authRepository = SupabaseAuthRepository();

  Future<void> signIn(String email, String password) async {
    await _authRepository.signIn(email: email, password: password);
  }

  Future<void> signUp(String email, String password) async {
    await _authRepository.signUp(email: email, password: password);
  }

  Future<void> signOut() async {
    await _authRepository.signOut();
  }

  User? getCurrentUser() {
    return _authRepository.currentUser;
  }
}

7. 集成认证与数据库操作

你可以将认证服务和数据库操作结合起来,确保只有认证用户才能访问某些数据:

class UserRepository extends SupabaseRepository {
  UserRepository() : super('users');

  Future<List<Map<String, dynamic>>> getActiveUsers() async {
    final user = supabase.auth.currentUser;
    if (user == null) {
      throw Exception('User not authenticated');
    }

    return await supabase
        .from(tableName)
        .select()
        .eq('is_active', true)
        .execute()
        .then((response) => response.data);
  }
}
回到顶部