Firebase 错误:没有名为';合并';

Firebase 错误:没有名为';合并';,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,我刚开始学习Flitter,并尝试将一个简单的Todo应用程序连接到Firestore。为此,我想使用setOption“merge”,这样以前的列表就不会被删除。但是,每次尝试调试时,我都会收到错误“没有名为“merge”的命名参数”。以下是合并的代码: import 'package:cloud_firestore/cloud_firestore.dart'; class DatabaseService { final String userID; DatabaseService(

我刚开始学习Flitter,并尝试将一个简单的Todo应用程序连接到Firestore。为此,我想使用setOption“merge”,这样以前的列表就不会被删除。但是,每次尝试调试时,我都会收到错误“没有名为“merge”的命名参数”。以下是合并的代码:

import 'package:cloud_firestore/cloud_firestore.dart';

class DatabaseService {
  final String userID;
  DatabaseService(this.userID);

  final CollectionReference userToDos =
      FirebaseFirestore.instance.collection('userToDos');

  Future setTodo(String key, bool value) async {
    return await userToDos.doc(userID).set({key: value}, merge: true);
  }

  Future deleteTodo(String key) async {
    return await userToDos.doc(userID).update({
      key: FieldValue.delete(),
    });
  }
下面是代码的其余部分:

import 'package:flutter/material.dart';
import 'add_item_dialog.dart';
import 'to_do_item.dart';
import 'database.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

void main() => runApp(MaterialApp(home: ToDo()));

class ToDo extends StatefulWidget {
  @override
  _ToDoState createState() => _ToDoState();
}

class _ToDoState extends State<ToDo> {
  User user;
  DatabaseService database;

  void addItem(String key) {
    database.setTodo(key, false);
    Navigator.pop(context);
  }

  void deleteItem(String key) {
    database.deleteTodo(key);
  }

  void toggleDone(String key, bool value) {
    database.setTodo(key, !value);
  }

  void newEntry() {
    showDialog<AlertDialog>(
        context: context,
        builder: (BuildContext context) {
          return AddItemDialog(addItem);
        });
  }

  Future<void> connectToFirebase() async {
    final FirebaseAuth authenticate = FirebaseAuth.instance;
    UserCredential result = await authenticate.signInAnonymously();

    user = result.user;

    // get [DatabaseService] instance for current user
    database = DatabaseService(user.uid);

    if (!(await database.checkIfUserExists())) {
      database.setTodo('Todo anlegen', false);
    }

    Stream userDocumentStream = database.getTodos();
    userDocumentStream
        .listen((documentSnapshot) => print(documentSnapshot.data));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('To-Do-App'),
        backgroundColor: Color.fromRGBO(35, 152, 185, 100),
      ),
      body: FutureBuilder(

          //  Wait until [connectToFirebase] returns stream
          future: connectToFirebase(),
          builder: (BuildContext context, AsyncSnapshot<void> snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return Center(child: CircularProgressIndicator());
            } else {
              // When stream exists, use Streambilder to wait for data
              return StreamBuilder<DocumentSnapshot>(
                stream: database.getTodos(),
                builder: (BuildContext context,
                    AsyncSnapshot<DocumentSnapshot> snapshot) {
                  if (!snapshot.hasData) {
                    return Center(child: CircularProgressIndicator());
                  } else {
                    // resolve stream... Stream<DocumentSnapshot> -> DocumentSnapshot -> Map<String, bool>
                    Map<String, dynamic> items = snapshot.data.data;

                    return ListView.builder(
                        itemCount: items.length,
                        itemBuilder: (context, i) {
                          String key = items.keys.elementAt(i);
                          return ToDoItem(
                            key,
                            items[key],
                            () => deleteItem(key),
                            () => toggleDone(key, items[key]),
                          );
                        });
                  }
                },
              );
            }
          }),
      floatingActionButton: FloatingActionButton(
        onPressed: newEntry,
        child: Icon(Icons.add),
        backgroundColor: Color.fromRGBO(35, 152, 185, 100),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入'add_item_dialog.dart';
导入“to_do_item.dart”;
导入“database.dart”;
导入“包:firebase_auth/firebase_auth.dart”;
导入“包:cloud_firestore/cloud_firestore.dart”;
void main()=>runApp(MaterialApp(home:ToDo());
类ToDo扩展StatefulWidget{
@凌驾
_ToDoState createState()=>\u ToDoState();
}
类_tostate扩展状态{
用户;
数据库服务数据库;
无效附加项(字符串键){
setTodo(key,false);
Navigator.pop(上下文);
}
void deleteItem(字符串键){
deleteTodo(键);
}
void toggleDone(字符串键,布尔值){
数据库.setTodo(键,!值);
}
void newEntry(){
显示对话框(
上下文:上下文,
生成器:(BuildContext上下文){
返回AddItemDialog(addItem);
});
}
未来的connectToFirebase()异步{
final FirebaseAuth authenticate=FirebaseAuth.instance;
UserCredential结果=等待身份验证。signinanoymously();
user=result.user;
//获取当前用户的[DatabaseService]实例
数据库=数据库服务(user.uid);
if(!(wait database.checkIfUserExists())){
setTodo('Todo anlegen',false);
}
Stream userDocumentStream=database.getTodos();
用户文档流
.listen((documentSnapshot)=>打印(documentSnapshot.data));
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本('To-Do-App'),
背景颜色:颜色。来自RGBO(35152185100),
),
正文:未来建设者(
//等待[connectToFirebase]返回流
未来:connectToFirebase(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.connectionState==connectionState.waiting){
返回中心(子项:CircularProgressIndicator());
}否则{
//当流存在时,使用Streambilder等待数据
返回流生成器(
流:database.getTodos(),
生成器:(BuildContext上下文,
异步快照(快照){
如果(!snapshot.hasData){
返回中心(子项:CircularProgressIndicator());
}否则{
//解析流…流->文档快照->映射
映射项=snapshot.data.data;
返回ListView.builder(
itemCount:items.length,
itemBuilder:(上下文,i){
字符串键=items.keys.elementAt(i);
返回DoItem(
钥匙
项目[关键],
()=>deleteItem(键),
()=>切换完成(键,项[key]),
);
});
}
},
);
}
}),
浮动操作按钮:浮动操作按钮(
onPressed:newEntry,
子:图标(Icons.add),
背景颜色:颜色。来自RGBO(35152185100),
),
);
}
}
依赖项:

  flutter:
    sdk: flutter


  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.3

  # Social sharing buttons
  share: '>=0.6.5 <2.0.0'


  # Google Firestore packages
  cloud_firestore: ^0.14.0+2
  firebase_auth: ^0.18.0+1
颤振:
sdk:颤振
#下面将Cupertino图标字体添加到应用程序中。
#与CupertinoIcons类一起用于iOS风格的图标。
cupertino_图标:^0.1.3
#社交分享按钮

共享:'>=0.6.5我对firestore了解不多,但查看您需要使用
SetOption
类进行合并:

Future setTodo(字符串键,布尔值)异步{
返回wait-userToDos.doc(userID.set({key:value},SetOptions(merge:true));
}