Flutter数据库管理插件dorm_bloc_database的使用

Flutter数据库管理插件dorm_bloc_database的使用

dorm_bloc_database

pub package pub popularity pub likes pub points

dorm_bloc_database 是一个基于 blocdORM 数据库管理插件。

开始使用

在命令行中运行以下命令以添加插件:

dart pub add dorm_bloc_database

使用 dorm_annotationsdorm_generator 生成您的 dORM 代码:

dart run build_runner build

这将创建一个 Dorm 类,您可以使用它来连接到此包。

使用方法

首先,创建一个 Reference

void main() {
  final Reference reference = Reference();
}

然后,将上面创建的引用传递给生成的 Dorm 类:

void main() {
  final Dorm dorm = Dorm(reference);
}

完整示例

以下是一个完整的示例,展示了如何使用 dorm_bloc_database 插件来管理用户数据。

import 'package:device_preview/device_preview.dart';
import 'package:dorm_bloc_database/dorm_bloc_database.dart';
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:provider/provider.dart';

import 'models.dart';

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

  final Engine engine = Engine();

  // 推荐的方法是有一个全局实例来访问生成的 `Dorm` 类。这里我们使用依赖注入,
  // 并且使用了一个很棒的解决方案叫做 `get_it`,但你可以自由地使用 `provider` 或任何其他方法。
  GetIt.instance.registerSingleton<Dorm>(Dorm(engine));

  runApp(DevicePreview(
    defaultDevice: DeviceInfo.genericPhone(
      platform: TargetPlatform.android,
      id: '',
      name: '',
      screenSize: const Size(360, 800),
    ),
    isToolbarVisible: false,
    builder: (_) => const MyApp(),
  ));
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Example',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  const HomeScreen({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        StreamProvider<AsyncSnapshot<List<User>>>( // 使用 StreamProvider 提供用户列表的异步快照
          initialData: const AsyncSnapshot.waiting(), // 初始状态为等待
          create: (_) => GetIt.instance
              .get<Dorm>() // 获取 Dorm 实例
              .users // 获取用户 Repository
              .repository // 获取 Repository 实例
              .pullAll() // 拉取所有用户数据
              .map((event) => AsyncSnapshot.withData(ConnectionState.active, event)), // 将事件映射为 AsyncSnapshot
        ),
      ],
      child: SafeArea(
        child: Scaffold(
          appBar: AppBar(title: const Text('Users')), // 设置应用栏标题
          body: Consumer<AsyncSnapshot<List<User>>>( // 使用 Consumer 来监听 AsyncSnapshot 的变化
            child: const Center(child: CircularProgressIndicator()), // 在加载时显示圆形进度指示器
            builder: (context, snapshot, child) {
              if (snapshot.connectionState == ConnectionState.waiting) {
                return child!; // 如果正在等待,则显示圆形进度指示器
              }
              final List<User> users = snapshot.data ?? []; // 获取用户列表
              if (users.isEmpty) {
                return const Center(child: Text('No users.')); // 如果没有用户,显示 "No users."
              }
              return ListView.builder( // 显示用户列表
                itemCount: users.length, // 用户数量
                itemBuilder: (context, i) {
                  final User user = users[i]; // 获取当前用户
                  return ListTile(
                    leading: const Icon(Icons.person), // 用户图标
                    title: Text(user.name), // 用户名
                    trailing: Row(
                      mainAxisSize: MainAxisSize.min,
                      children: [
                        OutlinedButton( // 编辑按钮
                          onPressed: () async {
                            final String? updatedName = await showDialog(
                              context: context,
                              builder: (_) => const TextInputDialog(title: 'Update user'), // 弹出对话框
                            );
                            if (updatedName == null) return;
                            await GetIt.instance
                                .get<Dorm>() // 获取 Dorm 实例
                                .users // 获取用户 Repository
                                .repository // 获取 Repository 实例
                                .push(User(id: user.id, name: updatedName)); // 更新用户信息
                          },
                          child: const Text('edit'), // 编辑文本
                        ),
                        const SizedBox(width: 10), // 间距
                        OutlinedButton( // 删除按钮
                          onPressed: () async {
                            await GetIt.instance
                                .get<Dorm>() // 获取 Dorm 实例
                                .users // 获取用户 Repository
                                .repository // 获取 Repository 实例
                                .pop(user.id); // 删除用户
                          },
                          child: const Text(
                            'delete',
                            style: TextStyle(color: Colors.red), // 删除文本颜色为红色
                          ),
                        ),
                      ],
                    ),
                  );
                },
              );
            },
          ),
          floatingActionButton: FloatingActionButton( // 添加按钮
            onPressed: () async {
              final String? name = await showDialog(
                context: context,
                builder: (_) => const TextInputDialog(title: 'Create user'), // 弹出对话框
              );
              if (name == null) return;
              await GetIt.instance
                  .get<Dorm>() // 获取 Dorm 实例
                  .users // 获取用户 Repository
                  .repository // 获取 Repository 实例
                  .put(const UserDependency(), UserData(name: name)); // 创建新用户
            },
            child: const Icon(Icons.add), // 添加图标
          ),
        ),
      ),
    );
  }
}

class TextInputDialog extends StatelessWidget {
  final String title;

  const TextInputDialog({super.key, required this.title});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider<TextEditingController>( // 使用 ChangeNotifierProvider 管理 TextEditingController
          create: (_) => TextEditingController(), // 创建 TextEditingController 实例
        ),
      ],
      child: AlertDialog(
        title: Text(title), // 对话框标题
        icon: const Icon(Icons.supervisor_account), // 图标
        content: Padding(
          padding: const EdgeInsets.symmetric(horizontal: 15),
          child: Consumer<TextEditingController>( // 使用 Consumer 监听 TextEditingController 的变化
            builder: (context, controller, _) {
              return TextFormField( // 文本输入框
                controller: controller, // 绑定 TextEditingController
                decoration: const InputDecoration(
                  border: OutlineInputBorder(), // 输入框边框样式
                  labelText: 'Name', // 输入框标签
                ),
              );
            },
          ),
        ),
        actions: [
          TextButton( // 取消按钮
            onPressed: () => Navigator.of(context).pop(), // 关闭对话框
            child: const Text('cancel', style: TextStyle(color: Colors.red)), // 取消文本颜色为红色
          ),
          Consumer<TextEditingController>( // 使用 Consumer 监听 TextEditingController 的变化
            builder: (context, controller, _) {
              return TextButton( // 提交按钮
                onPressed: () => Navigator.of(context).pop(controller.text), // 提交文本并关闭对话框
                child: const Text('submit'), // 提交文本
              );
            },
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


dorm_bloc_database 是一个用于 Flutter 的数据库管理插件,它结合了 dormbloc 两个库,提供了一个简单的方式来管理应用程序的本地数据库。dorm 是一个 ORM(对象关系映射)库,而 bloc 是一个状态管理库。通过结合这两个库,dorm_bloc_database 可以帮助你在 Flutter 应用中更高效地管理数据库操作和状态。

安装

首先,你需要在 pubspec.yaml 文件中添加 dorm_bloc_database 依赖:

dependencies:
  flutter:
    sdk: flutter
  dorm_bloc_database: ^0.1.0  # 请检查最新版本

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

基本用法

1. 定义数据模型

首先,你需要定义你的数据模型。dorm 使用注解来定义实体和字段。

import 'package:dorm/dorm.dart';

@Entity()
class User {
  @Field()
  int id;

  @Field()
  String name;

  @Field()
  String email;

  User({this.id, this.name, this.email});
}

2. 创建数据库连接

接下来,你需要创建一个数据库连接。dorm_bloc_database 提供了一个 DatabaseBloc 来管理数据库操作。

import 'package:dorm_bloc_database/dorm_bloc_database.dart';

final databaseBloc = DatabaseBloc(
  databaseName: 'my_database.db',
  version: 1,
  entities: [User],
);

3. 初始化数据库

在使用数据库之前,你需要初始化它。你可以在 main 函数中初始化数据库:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await databaseBloc.init();
  runApp(MyApp());
}

4. 使用 BLoC 进行数据库操作

你可以使用 DatabaseBloc 来执行数据库操作,例如插入、查询、更新和删除数据。

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BlocProvider(
        create: (context) => databaseBloc,
        child: HomePage(),
      ),
    );
  }
}

class HomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final databaseBloc = BlocProvider.of<DatabaseBloc>(context);

    return Scaffold(
      appBar: AppBar(title: Text('Dorm BLoC Database Example')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () async {
                final user = User(id: 1, name: 'John Doe', email: 'john@example.com');
                await databaseBloc.insert(user);
              },
              child: Text('Insert User'),
            ),
            ElevatedButton(
              onPressed: () async {
                final users = await databaseBloc.query<User>();
                print(users);
              },
              child: Text('Query Users'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部