Flutter云数据库交互插件firestore_api_converter的使用
Flutter云数据库交互插件firestore_api_converter的使用
编码一个Map
如果你有一个对象,可以将其转换为一个Map。然后使用以下方法将该Map编码后发送到Firestore REST API:
final map = {
'null': null,
'boolean': true,
'integer': 123,
'double': .5,
'timestamp': DateTime.utc(2023, 9, 13, 17, 43, 11, 0, 2002),
'string': 'abc',
'array': [true, 'abc', 123],
'map': {'boolean': true, 'string': 'abc', 'integer': 123},
};
final encoded = FirestoreApiConverter.toFirestore(map);
编码后的结果如下所示:
{
"fields": {
"null": { "nullValue": null },
"boolean": { "booleanValue": true },
"integer": { "integerValue": "123" },
"double": { "doubleValue": 0.5 },
"timestamp": { "timestampValue": "2023-09-13T17:43:11.002Z" },
"string": { "stringValue": "abc" },
"array": {
"arrayValue": {
"values": [
{ "booleanValue": true },
{ "stringValue": "abc" },
{ "integerValue": "123" }
]
}
},
"map": {
"mapValue": {
"fields": {
"boolean": { "booleanValue": true },
"string": { "stringValue": "abc" },
"integer": { "integerValue": "123" }
}
}
}
}
}
解码一个文档
解码通过Firestore REST API接收的文档:
final decoded = FirestoreApiConverter.fromFirestore(encoded);
类型支持
完全支持的类型
- null
- boolean
- integer
- double
- timestamp
- string
- array
- map
尚未支持的类型
目前我没有这些类型的用例来测试。如果您有,请提交一个PR。在开始工作之前,请阅读上面链接的讨论,并提出您的实现想法。
示例代码
以下是完整的示例代码:
import 'dart:convert';
import 'package:dump/dump.dart';
import 'package:firestore_api_converter/firestore_api_converter.dart';
void main() {
final map = {
'null': null,
'boolean': true,
'integer': 123,
'double': .5,
'timestamp': DateTime.utc(2023, 9, 13, 17, 43, 11, 0, 2002),
'string': 'abc',
'array': [true, 'abc', 123],
'map': {'boolean': true, 'string': 'abc', 'integer': 123},
};
final encoded = FirestoreApiConverter.toFirestore(map);
final decoded = FirestoreApiConverter.fromFirestore(encoded);
const encoder = JsonEncoder.withIndent(' ');
print(encoder.convert(encoded));
// {
// "fields": {
// "null": {
// "nullValue": null
// },
// "boolean": {
// "booleanValue": true
// },
// "integer": {
// "integerValue": "123"
// },
// "double": {
// "doubleValue": 0.5
// },
// "timestamp": {
// "timestampValue": "2023-09-13T17:43:11.002Z"
// },
// "string": {
// "stringValue": "abc"
// },
// "array": {
// "arrayValue": {
// "values": [
// {
// "booleanValue": true
// },
// {
// "stringValue": "abc"
// },
// {
// "integerValue": "123"
// }
// ]
// }
// },
// "map": {
// "mapValue": {
// "fields": {
// "boolean": {
// "booleanValue": true
// },
// "string": {
// "stringValue": "abc"
// },
// "integer": {
// "integerValue": "123"
// }
// }
// }
// }
// }
// }
// 我们不能使用jsonEncode来转储这种结构,因为它包含不可序列化的DateTime。
// 所以我们使用`dump`包。
print(dumpString(decoded));
// {
// "null": null,
// "boolean": true,
// "integer": 123,
// "double": 0.5,
// "timestamp": {
// "": "DateTime",
// "isUtc": true,
// "toString()": "2023-09-13 17:43:11.002Z"
// },
// "string": "abc",
// "array": [
// true,
// "abc",
// 123
// ],
// "map": {
// "boolean": true,
// "string": "abc",
// "integer": 123
// }
// }
}
更多关于Flutter云数据库交互插件firestore_api_converter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter云数据库交互插件firestore_api_converter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,关于Flutter与云数据库交互插件firestore_api_converter
的使用,这里提供一个简单的代码案例来展示如何集成和使用该插件。假设你已经有一个Flutter项目,并且已经配置好了Firebase Firestore。
1. 添加依赖
首先,确保在pubspec.yaml
文件中添加了cloud_firestore
和firestore_api_converter
的依赖:
dependencies:
flutter:
sdk: flutter
cloud_firestore: ^x.y.z # 替换为最新版本号
firestore_api_converter: ^a.b.c # 替换为最新版本号
然后运行flutter pub get
来安装依赖。
2. 配置Firebase
确保你的Firebase项目已经配置好,并且在你的Flutter项目中已经添加了Firebase的配置文件(通常是google-services.json
对于Android和GoogleService-Info.plist
对于iOS)。
3. 使用firestore_api_converter
firestore_api_converter
通常用于简化Firebase Firestore数据的序列化和反序列化。以下是一个简单的示例,展示如何使用该插件:
数据模型
假设我们有一个简单的用户数据模型:
import 'package:json_annotation/json_annotation.dart';
import 'package:firestore_api_converter/firestore_api_converter.dart';
part 'user_model.g.dart';
@JsonSerializable()
@FirestoreConverter()
class UserModel {
final String id;
final String name;
final int age;
UserModel({required this.id, required this.name, required this.age});
factory UserModel.fromJson(Map<String, dynamic> json) => _$UserModelFromJson(json);
Map<String, dynamic> toJson() => _$UserModelToJson(this);
}
运行flutter pub run build_runner build
来生成user_model.g.dart
文件。
Firestore交互
接下来,展示如何使用Firestore和firestore_api_converter
来读写数据:
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firestore_api_converter/firestore_api_converter.dart';
import 'user_model.dart'; // 导入之前定义的数据模型
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: FirestoreExample(),
);
}
}
class FirestoreExample extends StatefulWidget {
@override
_FirestoreExampleState createState() => _FirestoreExampleState();
}
class _FirestoreExampleState extends State<FirestoreExample> {
final FirebaseFirestore _firestore = FirebaseFirestore.instance;
@override
void initState() {
super.initState();
// 写入数据
_writeUserData();
// 读取数据
_readUserData();
}
Future<void> _writeUserData() async {
UserModel user = UserModel(id: '1', name: 'John Doe', age: 30);
await _firestore.collection('users').doc(user.id).set(user.toJson());
}
Future<void> _readUserData() async {
QuerySnapshot<Map<String, dynamic>> snapshot = await _firestore.collection('users').get();
List<UserModel> users = snapshot.docs.map((doc) => UserModel.fromJson(doc.data() as Map<String, dynamic>)).toList();
// 这里你可以更新UI,例如使用setState来显示用户列表
print(users);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Firestore Example'),
),
body: Center(
child: Text('Check console for Firestore data'),
),
);
}
}
4. 运行应用
确保你的Firebase项目已经正确配置,并且你的设备或模拟器已经连接到Firebase项目。然后运行你的Flutter应用,你应该能够在控制台中看到从Firestore读取的用户数据。
这个示例展示了如何使用firestore_api_converter
来简化Firebase Firestore数据的序列化和反序列化,并通过Flutter应用与Firestore进行交互。根据你的实际需求,你可以进一步扩展和修改这个示例。