Flutter功能管理插件supa_manager的使用

Flutter功能管理插件supa_manager的使用

本包简化了使用Supabase数据库的过程。它提供了用于执行CRUD(创建、读取、更新和删除)操作的通用方法。您可以查看示例包以了解如何完整地使用该包。

特性

  • 提供用于登录和创建新用户的认证。
  • 提供用于执行CRUD操作的通用方法。

开始使用

添加该包:

flutter pub add supa_manager

使用

要开始使用此包,您需要创建一个Configuration类的实例:

final configuration = Configuration();
await configuration.initialize('supabase url', 'supabase api key', 'supabase API secret');

这将使用提供的URL、API密钥和API密钥初始化Supabase客户端。

认证

要登录,请使用以下代码:

configuration.supaAuthManager.login('email', 'password');

要加载现有用户,请使用以下代码:

final databaseUser = configuration.supaAuthManager.loadUser();

如果用户会话有效,则返回用户。否则,返回null。

该包允许您处理所有需要的CRUD操作: 获取数据库存储库:

final databaseRepository = configuration.supaDatabaseRepository;

您需要继承TableData类以提供表名和表中的列。 例如:

class TaskTableData extends TableData<Task> {
  TaskTableData() {
    tableName = taskTableName;
  }

  @override
  Task fromJson(Map<String, dynamic> json) {
    return Task.fromJson(json);
  }
}

创建

databaseRepository.addEntry(tableData, TableEntry(item));

读取

databaseRepository.readEntries(tableData)

更新

databaseRepository.updateTableEntry(tableData, TableEntry(item));

删除

databaseRepository.deleteTableEntry(tableData, TableEntry(item));

示例代码

以下是来自示例项目的代码片段。

初始化

为了开始使用,您需要使用您的Supabase API密钥和密钥初始化supa_manager。由于示例使用了一个在使用的API密钥和密钥以及URL,因此示例将这些值存储在示例项目资产目录中的secrets.json文件中。您需要创建自己的文件才能使用示例项目。 示例项目使用Riverpod,但您可以使用任何状态管理库。 这是在main.dart中的初始化代码:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final secrets = await SecretLoader(secretPath: 'assets/secrets.json').load();
  configuration = Configuration();
  await configuration.initialize(secrets.url, secrets.apiKey, secrets.apiSecret);
  runApp(const ProviderScope(child: MyApp()));
}

secrets.json文件将看起来像这样:

{
  "url" : "https://<yourinstance>.supabase.co",
  "api_key" : "<your key>",
  "api_secret": "<your secret>"
}

SecretLoader是一个简单的类(位于示例项目的lib目录下),用于加载Supabase URL、密钥和密钥。由于这些值敏感,因此不会将其提交到源代码控制。创建一个Configuration类并用URL、API密钥和API密钥初始化。这也将初始化Supabase实例以及SupaAuthManager和SupaDatabaseManager类。

该示例还使用go_router进行页面处理。

认证

为了使用数据库,必须先对用户进行认证。SupaAuthManager类处理这一点。如果您查看LoginDialog类,您会看到有两个重要的方法:

Future<Result<DatabaseUser>> login(String email, String password);

和:

Future<Result<bool>> createUser(String email, String password);

Result类返回Result.successResult.failureResult.errorMessage。请参阅LoginDialog类以了解如何使用它们。

数据库

为了使用数据库,您首先需要在Supabase中创建表格。由于该包假定您基于用户ID的表,因此您需要在每个表中添加一个userId字段。这将是类型为uuid的字段。然后,您需要为每个表创建两个类:一个基于TableData,它给出表名和一个从JSON数据转换为您的类的fromJson方法。第二个表基于TableEntry。此类提供一个toJson方法、一个id属性和一个addUserId方法,用于创建一个带有已设置userId的类副本。

以下是任务类:

const taskTableName = 'TodayTasks';
const categoryTableName = 'TodayCategory';

class TaskTableData extends TableData<Task> {
  TaskTableData() {
    tableName = taskTableName;
  }

  @override
  Task fromJson(Map<String, dynamic> json) {
    return Task.fromJson(json);
  }
}

class TaskTableEntry with TableEntry<Task> {
  final Task task;

  TaskTableEntry(this.task);

  @override
  TaskTableEntry addUserId(String userId) {
    return TaskTableEntry(task.copyWith(userId: userId));
  }

  @override
  Map<String, dynamic> toJson() {
    return task.toJson();
  }

  @override
  int? get id => task.id;

  @override
  set id(int? id) {}
}

读取列表项

要获取所有条目的列表,请调用readEntries方法,如下所示:

Future<Result<List<Task>>> getTasks() async {
  return databaseRepository.readEntries(taskTableData);
}

对于更复杂的调用,您可以使用:

Future<Result<List<T>>> readEntriesWhere<T>(TableData<T> tableData, String columnName, int id);

或:

Future<Result<List<T>>> selectEntriesWhere<T>(TableData<T> tableData, List<SelectEntry> selections);

其中SelectEntry定义列名、值和类型(和/或)。第一个用于仅选择特定列。第二个允许您使用and/or查询。

以下是选择任务的示例:

Future<Result<List<T>>> getTodaysTasks() async {
  return databaseRepository.selectEntriesWhere(taskTableData, [
    SelectEntry.and('done', 'false'),
    SelectEntry.and('doLater', 'false')
  ]);
}

添加

要添加数据,可以编写如下代码:

Future<Result<Task?>> addTask(Task task) async {
  final result = await databaseRepository.addEntry(taskTableData, TaskTableEntry(task));
  notifyListeners();
  return result;
}

这将调用带有TableData类和新的TableEntry类的addEntry方法。

删除

要删除条目,只需调用deleteTableEntry方法,如下所示:

Future<Result<Task?>> deleteTask(Task task) async {
  final result = await databaseRepository.deleteTableEntry(
    taskTableData, TaskTableEntry(task));
  notifyListeners();
  return result;
}

更新

要更新条目,只需调用updateTableEntry方法,如下所示:

Future<Result<Task?>> updateTask(Task task) async {
  final result = await databaseRepository.updateTableEntry(
    taskTableData, TaskTableEntry(task));
  notifyListeners();
  return result;
}

更多关于Flutter功能管理插件supa_manager的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter功能管理插件supa_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用Flutter功能管理插件supa_manager的代码案例。supa_manager是一个用于管理Flutter应用功能的插件,如主题切换、语言切换等。为了演示其使用,我们假设你需要实现一个简单的主题切换功能。

首先,确保你已经在pubspec.yaml文件中添加了supa_manager依赖:

dependencies:
  flutter:
    sdk: flutter
  supa_manager: ^latest_version  # 请替换为最新版本号

然后,运行flutter pub get来获取依赖。

接下来,按照以下步骤实现主题切换功能:

  1. 设置主题数据

在你的应用的主文件(通常是main.dart)中,定义两个主题数据:

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

void main() {
  // 初始化SupaManager
  SupaManager.init(
    storage: SupaStorage.sharedPreferences, // 使用SharedPreferences存储配置
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: SupaManager.themeData(context), // 使用SupaManager获取主题数据
      darkTheme: ThemeData(
        brightness: Brightness.dark,
        primaryColor: Colors.deepPurple,
        accentColor: Colors.cyanAccent,
      ),
      themeMode: SupaManager.themeMode(context), // 使用SupaManager获取主题模式
      home: MyHomePage(),
    );
  }
}
  1. 创建主页面

在主页面(MyHomePage.dart)中,添加一个按钮来切换主题:

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Supa Manager Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Current Theme Mode: ${SupaManager.themeMode(context) == ThemeMode.dark ? 'Dark' : 'Light'}',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                // 切换主题模式
                SupaManager.setThemeMode(
                  context,
                  SupaManager.themeMode(context) == ThemeMode.dark
                      ? ThemeMode.light
                      : ThemeMode.dark,
                );
              },
              child: Text('Switch Theme'),
            ),
          ],
        ),
      ),
    );
  }
}
  1. 持久化存储

在上面的代码中,我们使用了SupaStorage.sharedPreferences来持久化存储主题配置。这意味着当用户重启应用时,之前选择的主题模式将会被恢复。

  1. 运行应用

现在,你可以运行你的Flutter应用,并通过点击按钮来切换主题模式。主题模式的变化将被持久化存储,并在应用重启后恢复。

这个示例展示了如何使用supa_manager插件来实现一个简单的主题切换功能。你可以根据需要进一步扩展此功能,例如添加更多的主题选项或与其他功能(如语言切换)集成。

回到顶部