Flutter云数据库交互插件firestore_api_converter的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

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

1 回复

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


当然,关于Flutter与云数据库交互插件firestore_api_converter的使用,这里提供一个简单的代码案例来展示如何集成和使用该插件。假设你已经有一个Flutter项目,并且已经配置好了Firebase Firestore。

1. 添加依赖

首先,确保在pubspec.yaml文件中添加了cloud_firestorefirestore_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进行交互。根据你的实际需求,你可以进一步扩展和修改这个示例。

回到顶部