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.success
、Result.failure
或Result.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
更多关于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
来获取依赖。
接下来,按照以下步骤实现主题切换功能:
- 设置主题数据
在你的应用的主文件(通常是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(),
);
}
}
- 创建主页面
在主页面(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'),
),
],
),
),
);
}
}
- 持久化存储
在上面的代码中,我们使用了SupaStorage.sharedPreferences
来持久化存储主题配置。这意味着当用户重启应用时,之前选择的主题模式将会被恢复。
- 运行应用
现在,你可以运行你的Flutter应用,并通过点击按钮来切换主题模式。主题模式的变化将被持久化存储,并在应用重启后恢复。
这个示例展示了如何使用supa_manager
插件来实现一个简单的主题切换功能。你可以根据需要进一步扩展此功能,例如添加更多的主题选项或与其他功能(如语言切换)集成。