Flutter Firebase数据库集成插件dorm_firebase_database的使用
Flutter Firebase数据库集成插件dorm_firebase_database的使用
dorm_firebase_database
这是一个使用firebase_database
包的dORM数据库引擎实现。
开始使用
在命令行中运行以下命令:
dart pub add dorm_firebase_database
使用dorm_annotations
和dorm_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
更多关于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');
}