Flutter云数据库访问插件cloud_firestore_database_wrapper的使用

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

Flutter云数据库访问插件cloud_firestore_database_wrapper的使用

Getting Started(入门)

instance = FirebaseFirestore.instance;
dataSource = FirestoreDataSource(instance);

final user = User(
          uid: uid,
          name: "Bob",
          photoUrl: "url",
          email: "example@example.com",
          phoneNumber: "1234567890",
          type: 3,
          date: "12/14/2020",
          score: 300,
          userType: []);
await dataSource.create(path, id: user.uid, data: user.toJson());

User user = await dataSource.getSingleByRefId<User>(
            path, originaluser.uid, User.fromJSON);

Implement FromJson(实现FromJson)

为了使User类能够从Firebase中获取的数据中正确解析,你需要在User类中实现fromJson方法。例如:

class User {
  String uid;
  String name;
  String photoUrl;
  String email;
  String phoneNumber;
  int type;
  String date;
  int score;
  List<dynamic> userType;

  User(this.uid, this.name, this.photoUrl, this.email, this.phoneNumber, this.type, this.date, this.score, this.userType);

  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      json['uid'],
      json['name'],
      json['photoUrl'],
      json['email'],
      json['phoneNumber'],
      json['type'],
      json['date'],
      json['score'],
      json['userType'],
    );
  }
}

Get Single(获取单个对象)

使用getSingleByRefId方法可以获取一个特定的用户信息:

User user = await dataSource.getSingleByRefId<User>(
            path, originaluser.uid, User.fromJson);

Create(创建对象)

创建一个新用户并将其保存到Firebase中:

final user = User(
          uid: uid,
          name: "Bob",
          photoUrl: "url",
          email: "example@example.com",
          phoneNumber: "1234567890",
          type: 3,
          date: "12/14/2020",
          score: 300,
          userType: []);
await dataSource.create(path, id: user.uid, data: user.toJson());

Delete(删除对象)

删除一个特定用户的记录:

dataSource.delete(path + "/" + uid);

Get Collection(获取集合)

获取所有用户的信息:

List<User> users = await dataSource.getCollectionWithParams<User>(path);

Update(更新对象)

更新一个用户的记录:

User updatedUser = User(
          uid: uid,
          name: "Bob Updated",
          photoUrl: "newurl",
          email: "updated@example.com",
          phoneNumber: "0987654321",
          type: 4,
          date: "12/15/2020",
          score: 400,
          userType: []);
await dataSource.update(path + "/" + uid, updatedUser.toJson());

Get Collection With Params(带参数获取集合)

获取特定条件下的用户列表:

List<User> users = await dataSource.getCollectionWithParams<User>(path, where: {"type": 3});

Get Collection Stream With Params(带参数获取流集合)

监听特定条件下的用户列表变化:

Stream<List<User>> usersStream = dataSource.getCollectionStreamWithParams<User>(path, where: {"type": 3});

完整示例代码

以下是一个完整的示例代码,展示了如何使用cloud_firestore_database_wrapper插件来操作Firebase中的数据。

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:cloud_firestore_database_wrapper/src/firestore_data_source.dart';
import 'package:cloud_firestore_database_wrapper/util/firestore_parser.dart';
import '../test/generate_model.dart';
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import '../test/mock_data/mock_user.dart' as mockusers;
import '../test/test_models/user.dart';

Future<void> main() async {
  // 初始化Flutter绑定
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化Firebase
  await Firebase.initializeApp();

  runApp(
    MyApp(),
  );
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  MyAppState createState() {
    return MyAppState();
  }
}

class MyAppState extends State<MyApp> {
  // 用于跟踪列表项可见状态的全局键
  final GlobalKey<AnimatedListState> listKey = GlobalKey<AnimatedListState>();

  // 数据源
  List<User> _data = [];
  final path = 'users';
  final FirebaseFirestore finstance = FirebaseFirestore.instance;
  final FirestoreDataSource dataSource = FirestoreDataSource(
      FirestoreParser(generateModel), FirebaseFirestore.instance);
  num index = 0;

  [@override](/user/override)
  Future<void> initState() async {
    for (var user in mockusers.users) {
      var ref = finstance.collection(path).doc(user['uid']);
      ref.set(user);
      index++;
    }
    _data = await dataSource.getCollectionwithParams<User>(path);
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      children: [
        SizedBox(
          height: 300,
          child: AnimatedList(
            // 给AnimatedList分配全局键
            key: listKey,
            initialItemCount: _data.length,
            // 类似于ListView的itemBuilder,但AnimatedList还具有额外的动画参数。
            itemBuilder: (context, index, animation) {
              // 将行小部件拆分为方法,以便可以在_removeSingleItem()方法中共享它。
              var name = _data[index].name;
              if (name != null) {
                return _buildItem(name, animation);
              }
              return _buildItem("", animation);
            },
          ),
        ),
        ElevatedButton(
          child: Text('插入项目', style: TextStyle(fontSize: 20)),
          onPressed: () {
            _insertSingleItem();
          },
        ),
        ElevatedButton(
          child: Text('移除项目', style: TextStyle(fontSize: 20)),
          onPressed: () {
            _removeSingleItem();
          },
        )
      ],
    );
  }

  // 具有动画卡片的动画行
  Widget _buildItem(String name, Animation<double> animation) {
    return SizeTransition(
      sizeFactor: animation,
      child: Card(
        child: ListTile(
          title: Text(
            name,
            style: TextStyle(fontSize: 20),
          ),
        ),
      ),
    );
  }

  void _insertSingleItem() {
    // 仅为演示目的选择任意位置
    int insertIndex = 2;
    // 向数据列表中添加项目
    var date = DateTime.now();

    var json = {
      "date": date.toString(),
      "email": "example@example.com",
      "name": "John",
      "photoUrl": "url",
      "phoneNumber": "1234567890",
      "type": 3,
      "userType": [],
      "score": 100
    };
    var user = User(json);
    dataSource.addDocToCollection(path, user);
    _data.insert(insertIndex, user);
  }

  void _removeSingleItem() {
    int removeIndex = 2;
    // 从数据列表中移除项目,但保留副本以供动画使用。
    User removedItem = _data.removeAt(removeIndex);
    var uid = removedItem.uid;

    dataSource.delete(path + "/" + uid);
    // 此构建器仅用于在项目仍在动画离开时显示行。
    // 项目已从数据列表中删除。
  }
}

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

1 回复

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


当然,以下是一个关于如何使用Flutter中的cloud_firestore_database_wrapper插件来访问云数据库的示例代码。请注意,这个插件的具体实现和API可能有所不同,但以下代码提供了一个基本的使用框架。如果cloud_firestore_database_wrapper是一个自定义封装或者是一个不太常见的插件,你可能需要参考它的官方文档或仓库进行适当调整。

首先,确保你已经在pubspec.yaml文件中添加了依赖项:

dependencies:
  flutter:
    sdk: flutter
  cloud_firestore: ^x.y.z  # 使用实际的版本号
  # 假设cloud_firestore_database_wrapper是一个自定义或第三方插件
  cloud_firestore_database_wrapper: ^a.b.c  # 使用实际的版本号

然后,运行flutter pub get来获取依赖项。

接下来,我们来看如何在Flutter应用中使用这个插件。

import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:cloud_firestore_database_wrapper/cloud_firestore_database_wrapper.dart'; // 假设包名正确

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Firestore Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 假设CloudFirestoreDatabaseWrapper是插件提供的类
  final CloudFirestoreDatabaseWrapper _dbWrapper = CloudFirestoreDatabaseWrapper();
  List<Map<String, dynamic>> _documents = [];

  @override
  void initState() {
    super.initState();
    _fetchDocuments();
  }

  void _fetchDocuments() async {
    try {
      // 假设fetchDocuments是一个返回文档列表的方法
      QuerySnapshot snapshot = await _dbWrapper.fetchDocuments('your_collection_name');
      setState(() {
        _documents = snapshot.docs.map((doc) => doc.data() as Map<String, dynamic>).toList();
      });
    } catch (e) {
      print('Error fetching documents: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Firestore Documents'),
      ),
      body: ListView.builder(
        itemCount: _documents.length,
        itemBuilder: (context, index) {
          Map<String, dynamic> document = _documents[index];
          return ListTile(
            title: Text(document['name'] as String),
            subtitle: Text(document['description'] as String),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 示例:添加新文档
          _addDocument();
        },
        tooltip: 'Add Document',
        child: Icon(Icons.add),
      ),
    );
  }

  void _addDocument() async {
    try {
      // 假设addDocument是一个添加新文档的方法
      await _dbWrapper.addDocument('your_collection_name', {
        'name': 'New Document',
        'description': 'This is a new document added to the collection.',
      });
      _fetchDocuments(); // 刷新列表
    } catch (e) {
      print('Error adding document: $e');
    }
  }
}

// 假设CloudFirestoreDatabaseWrapper类的实现如下(这只是一个示例,实际插件可能有所不同)
class CloudFirestoreDatabaseWrapper {
  final FirebaseFirestore _firestore = FirebaseFirestore.instance;

  Future<QuerySnapshot> fetchDocuments(String collectionName) {
    return _firestore.collection(collectionName).get();
  }

  Future<void> addDocument(String collectionName, Map<String, dynamic> data) {
    return _firestore.collection(collectionName).add(data);
  }
}

请注意,上述代码中的CloudFirestoreDatabaseWrapper类是一个假设的实现,它直接使用了FirebaseFirestore实例。如果cloud_firestore_database_wrapper插件提供了不同的API或方法,你需要根据插件的文档进行相应的调整。

另外,请确保你的Firebase项目已经配置好,并且你的应用有权限访问Firestore数据库。这通常涉及到在Firebase控制台中为你的应用添加Firestore数据库,并在你的Flutter项目中配置相应的Google服务文件。

回到顶部