Flutter Firebase数据库集成插件dorm_firebase_database的使用

Flutter Firebase数据库集成插件dorm_firebase_database的使用

dorm_firebase_database

pub package pub popularity pub likes pub points

这是一个使用firebase_database的dORM数据库引擎实现。

开始使用

在命令行中运行以下命令:

dart pub add dorm_firebase_database

使用dorm_annotationsdorm_generator生成你的dORM代码:

dart run build_runner build

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

使用

在访问任何Firebase类之前,初始化你的应用:

void main() async {
  await Firebase.initializeApp();

  // 或者,如果你正在处理非默认应用
  await Firebase.initializeApp(name: 'app-1');

  // 你也可以传递`options`参数,包含由FlutterFire生成的选项
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
}

创建一个FirebaseInstance,一个管理当前Firebase应用的类:

void main() {
  const FirebaseInstance instance = FirebaseInstance();

  // 或者,如果你正在处理非默认应用
  final FirebaseInstance instance = FirebaseInstance.custom(Firebase.app('app-1'));

  // 你还可以通过`offlineMode`控制离线管理
  const FirebaseInstance instance = FirebaseInstance(offlineMode: OfflineMode.include);
}

使用这个实例创建一个Reference

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

  // 或者,如果你想在'data/'下创建你的数据库
  final Reference reference = Reference(instance, 'data');
}

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

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

完整示例

以下是完整的示例代码,展示如何使用dorm_firebase_database插件。

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

import 'models.dart';

const bool useDatabaseEmulator = true;

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化Firebase应用,替换为你自己的Firebase选项
  await Firebase.initializeApp(
    options: const FirebaseOptions(
      apiKey: 'AIzaSyAgUhHU8wSJgO5MVNy95tMT07NEjzMOfz0',
      authDomain: 'react-native-firebase-testing.firebaseapp.com',
      databaseURL: 'https://react-native-firebase-testing.firebaseio.com',
      projectId: 'react-native-firebase-testing',
      storageBucket: 'react-native-firebase-testing.appspot.com',
      messagingSenderId: '448618578101',
      appId: '1:448618578101:web:772d484dc9eb15e9ac3efc',
      measurementId: 'G-0N1G9FLDZE',
    ),
  );

  // 如果使用数据库模拟器,可开启
  if (useDatabaseEmulator) {
    FirebaseDatabase.instance.useDatabaseEmulator('localhost', 9000);
  }

  // 初始化FirebaseInstance和Engine
  const FirebaseInstance instance = FirebaseInstance();
  const Engine engine = Engine(instance, path: 'prod');

  // 建议有一个全局访问生成的`Dorm`类的方法。这里我们使用依赖注入,使用了一个叫做`get_it`的解决方案。
  GetIt.instance.registerSingleton<Dorm>(const 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>>>( // 提供用户的实时更新
          initialData: const AsyncSnapshot.waiting(),
          create: (_) => GetIt.instance
              .get<Dorm>()
              .users
              .repository
              .pullAll()
              .map((event) =>
                  AsyncSnapshot.withData(ConnectionState.active, event)),
        ),
      ],
      child: SafeArea(
        child: Scaffold(
          appBar: AppBar(title: const Text('Users')),
          body: Consumer<AsyncSnapshot<List<User>>>( // 显示用户列表
            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.'));
              }
              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>()
                                .users
                                .repository
                                .push(User(id: user.id, name: updatedName));
                          },
                          child: const Text('edit'),
                        ),
                        const SizedBox(width: 10),
                        OutlinedButton(
                          onPressed: () async { // 删除用户
                            await GetIt.instance
                                .get<Dorm>()
                                .users
                                .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>()
                  .users
                  .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>(
          create: (_) => TextEditingController(),
        ),
      ],
      child: AlertDialog(
        title: Text(title),
        icon: const Icon(Icons.supervisor_account),
        content: Padding(
          padding: const EdgeInsets.symmetric(horizontal: 15),
          child: Consumer<TextEditingController>(
            builder: (context, controller, _) {
              return TextFormField(
                controller: controller,
                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>(
            builder: (context, controller, _) {
              return TextButton(
                onPressed: () => Navigator.of(context).pop(controller.text),
                child: const Text('submit'),
              );
            },
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


dorm_firebase_database 是一个用于 Flutter 的插件,用于简化与 Firebase Realtime Database 的集成。它提供了一种声明式的方式来定义数据模型,并自动处理与 Firebase 的交互。以下是如何使用 dorm_firebase_database 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  dorm_firebase_database: ^0.1.0  # 请使用最新版本

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

2. 初始化 Firebase

在使用 dorm_firebase_database 之前,你需要确保 Firebase 已经在你的 Flutter 项目中正确初始化。通常,你可以在 main.dart 中初始化 Firebase:

import 'package:firebase_core/firebase_core.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

3. 定义数据模型

dorm_firebase_database 使用注解来定义数据模型。你可以通过创建一个类并使用 @DataModel@DataField 注解来定义你的数据模型。

import 'package:dorm_firebase_database/dorm_firebase_database.dart';

@DataModel()
class User {
  @DataField()
  String id;

  @DataField()
  String name;

  @DataField()
  int age;

  User({required this.id, required this.name, required this.age});
}

4. 创建数据仓库

接下来,你需要创建一个数据仓库来处理与 Firebase 的交互。dorm_firebase_database 提供了 FirebaseDatabaseRepository 类来简化这个过程。

import 'package:dorm_firebase_database/dorm_firebase_database.dart';

class UserRepository extends FirebaseDatabaseRepository<User> {
  UserRepository() : super(path: 'users');
}

5. 使用数据仓库

现在你可以使用 UserRepository 来执行 CRUD 操作。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  final userRepository = UserRepository();

  // 添加用户
  final user = User(id: '1', name: 'John Doe', age: 30);
  await userRepository.add(user);

  // 获取用户
  final retrievedUser = await userRepository.get('1');
  print(retrievedUser?.name); // 输出: John Doe

  // 更新用户
  await userRepository.update(User(id: '1', name: 'Jane Doe', age: 31));

  // 删除用户
  await userRepository.delete('1');
}

6. 监听实时更新

dorm_firebase_database 还支持监听 Firebase Realtime Database 的实时更新。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  final userRepository = UserRepository();

  // 监听用户列表
  userRepository.watchAll().listen((users) {
    print('Users updated: $users');
  });

  // 监听特定用户
  userRepository.watch('1').listen((user) {
    print('User updated: $user');
  });
}

7. 处理错误

在实际应用中,你可能需要处理 Firebase 操作中的错误。dorm_firebase_database 会抛出异常,你可以使用 try-catch 块来捕获和处理这些异常。

try {
  await userRepository.add(user);
} catch (e) {
  print('Error adding user: $e');
}
回到顶部