Firebase 颤振,FieldValue.removeArray()不工作

Firebase 颤振,FieldValue.removeArray()不工作,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,我正试图从firestore db中的列表中删除元素,但它不起作用。我发现奇怪的是FieldValue.arrayUnion()和FieldValue.delete()工作正常。为什么FieldValue.arrayRemove()是唯一不起作用的?谢谢 数据库服务 import'包:cloud_firestore/cloud_firestore.dart'; 导入“包:firebase_auth/firebase_auth.dart”; 导入“package:innovative_world/

我正试图从firestore db中的列表中删除元素,但它不起作用。我发现奇怪的是FieldValue.arrayUnion()和FieldValue.delete()工作正常。为什么FieldValue.arrayRemove()是唯一不起作用的?谢谢

数据库服务
import'包:cloud_firestore/cloud_firestore.dart';
导入“包:firebase_auth/firebase_auth.dart”;
导入“package:innovative_world/models/list_model.dart”;
类数据库服务{
//收藏参考
CollectionReference listCollection=Firestore.instance.collection(“列表”);
//获取当前用户id
最后一个字符串uid;
数据库服务({this.uid});
//将数据设置为firestore db
未来setUserData(列表)异步{
return wait listCollection.document(uid).setData({
“列表”:列表
});
}
//不希望删除元素
未来的deleteListArr(int索引)异步{
返回等待列表集合。文档(uid)
.updateData({“列表”:FieldValue.arrayRemove([index])});
}
//用户列表快照
UserList\u userListFromSnapshot(文档快照快照){
返回用户列表(
uid:uid,
列表:snapshot.data[“list”].cast().toList()
); 
} 
//用于用户待办事项列表的流
流获取用户列表流{
返回listCollection.document(uid).snapshots()
.map(_userListFromSnapshot);
}
}
家 导入“包装:颤振/材料.省道”; 导入“package:flatter/rendering.dart”; 导入“包:innovative_world/services/auth_service.dart”; 导入“package:innovative_world/models/list_model.dart”; 导入“package:innovative_world/services/database_service.dart”; 导入“包装:创新世界/共享/装饰.dart”; 导入“package:innovative_world/shared/loading.dart”; 导入“包:provider/provider.dart”; 导入“包:innovative_world/models/user_model.dart”; 导入“package:innovative_world/models/list_model.dart”; 类Home扩展了StatefulWidget{ @凌驾 _HomeState createState()=>\u HomeState(); } 类(HomeState扩展状态){ 字符串-文本; final _formKey=GlobalKey(); 列表userDoc=[]; @凌驾 小部件构建(构建上下文){ 最终用户=提供者(上下文); 返回流生成器( 流:DatabaseService(uid:user.uid).userListStream, 生成器:(上下文,快照){ if(snapshot.hasData){ UserList UserList=snapshot.data; //List userDoc=[userList.List.toString()]; 返回脚手架( 背景颜色:颜色。蓝色[200], appBar:appBar( 标题:正文( “创建列表”, 样式:TextStyle( 字体大小:23.0, ), ), 标高:0.0, 行动:[ FlatButton.icon( 已按下:(){ AuthService().signOut(); }, 图标:图标(Icons.person), 标签:文本(“注销”), ), ], ), 主体:填充物( 填充:LTRB(20.0,25.0,20.0,0.0)中的常数边集, 子:列( 儿童:[ 形式( 键:_formKey, 子:列( 儿童:[ TextFormField( 验证器:(val)=> val.isEmpty?“输入文本”:null, 一旦更改:(val)=>setState(()=>_text=val), 装饰:InputDecorationConst.copyWith( hintText:“创建列表…”), ), 升起的按钮( onPressed:()异步{ if(_formKey.currentState.validate()){ userDoc.add(_text); _formKey.currentState.reset(); 等待数据库服务(uid:user.uid) .setUserData(userDoc??userList.list); } }, 颜色:颜色。粉红色, 子:文本( “添加到列表”, 样式:TextStyle( 字体大小:15.0,颜色:彩色。白色), ), ), ], ), ), 尺寸箱(高度:15.0), ListView.builder( 收缩膜:对, itemCount:userList.list.length, itemBuilder:(上下文,索引){ returnforlist(索引:index,列表:userList.list); }, ), ], ), ), ); }否则{ 返回加载(); } }); } } 类ForList扩展了StatefulWidget{ 最终整数指数; 最终名单; ForList({this.index,this.theList}); @凌驾 _ForListState createState()=>\u ForListState(); } 类\u ForListState扩展了状态{ bool-isSelected=false;
 import 'package:cloud_firestore/cloud_firestore.dart';
    import 'package:firebase_auth/firebase_auth.dart';
    import "package:innovative_world/models/list_model.dart";

    class DatabaseService {
      // Collection Reference
      CollectionReference listCollection = Firestore.instance.collection("list");

      // Get current users id
      final String uid;
      DatabaseService({this.uid});

      // Set data to firestore db
      Future setUserData(List<String> list) async {
        return await listCollection.document(uid).setData({ 
          "list": list
        });
      }

      // DOES NOT WANT TO REMOVE ELEMENTS
      Future deleteListArr(int index) async {
        return await listCollection.document(uid)
          .updateData({ "list": FieldValue.arrayRemove([index]) });
      }

      // UserList snapshot
      UserList _userListFromSnapshot(DocumentSnapshot snapshot) {
        return UserList(
          uid: uid, 
          list: snapshot.data["list"].cast<String>().toList()
          ); 
      } 
      // Stream for user's to do list
      Stream<UserList> get userListStream {
        return listCollection.document(uid).snapshots()
          .map(_userListFromSnapshot);
      }
    }
  import "package:flutter/material.dart";
    import 'package:flutter/rendering.dart';
    import "package:innovative_world/services/auth_service.dart";
    import "package:innovative_world/models/list_model.dart";
    import 'package:innovative_world/services/database_service.dart';
    import "package:innovative_world/shared/decoration.dart";
    import 'package:innovative_world/shared/loading.dart';
    import 'package:provider/provider.dart';
    import "package:innovative_world/models/user_model.dart";
    import "package:innovative_world/models/list_model.dart";


    class Home extends StatefulWidget {
      @override
      _HomeState createState() => _HomeState();
    }

    class _HomeState extends State<Home> {
      String _text;
      final _formKey = GlobalKey<FormState>();
      List<String> userDoc = [];


      @override
      Widget build(BuildContext context) {
        final user = Provider.of<UserId>(context);

        return StreamBuilder<UserList>(
            stream: DatabaseService(uid: user.uid).userListStream,
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                UserList userList = snapshot.data;
                // List<String> userDoc = [userList.list.toString()];
                return Scaffold(
                  backgroundColor: Colors.blue[200],
                  appBar: AppBar(
                    title: Text(
                      "Create List",
                      style: TextStyle(
                        fontSize: 23.0,
                      ),
                    ),
                    elevation: 0.0,
                    actions: <Widget>[
                      FlatButton.icon(
                        onPressed: () {
                          AuthService().signOut();
                        },
                        icon: Icon(Icons.person),
                        label: Text("Sign out"),
                      ),
                    ],
                  ),
                  body: Padding(
                    padding: const EdgeInsets.fromLTRB(20.0, 25.0, 20.0, 0.0),
                    child: Column(
                      children: <Widget>[
                        Form(
                          key: _formKey,
                          child: Column(
                            children: <Widget>[
                              TextFormField(
                                validator: (val) =>
                                    val.isEmpty ? "Enter text" : null,
                                onChanged: (val) => setState(() => _text = val),
                                decoration: InputDecorationConst.copyWith(
                                    hintText: "Create List..."),
                              ),
                              RaisedButton(
                                onPressed: () async {
                                  if (_formKey.currentState.validate()) {
                                    userDoc.add(_text);

                                    _formKey.currentState.reset();
                                    await DatabaseService(uid: user.uid)
                                        .setUserData(userDoc ?? userList.list);
                                  }
                                },
                                color: Colors.pink,
                                child: Text(
                                  "Add to list",
                                  style: TextStyle(
                                      fontSize: 15.0, color: Colors.white),
                                ),
                              ),
                            ],
                          ),
                        ),
                        SizedBox(height: 15.0),
                        ListView.builder(
                          shrinkWrap: true,
                          itemCount: userList.list.length,
                          itemBuilder: (context, index) {
                            return ForList(index: index, theList: userList.list);
                          },
                        ),
                      ],
                    ),
                  ),
                );
              } else {
                return Loading();
              }
            });
      }
    }

    class ForList extends StatefulWidget {
      final int index;
      final List<String> theList;

      ForList({this.index, this.theList});

      @override
      _ForListState createState() => _ForListState();
    }

    class _ForListState extends State<ForList> {
      bool isSelected = false;

      @override
      Widget build(BuildContext context) {
        final user = Provider.of<UserId>(context);

        return Column(
          children: <Widget>[
            Card(
              child: CheckboxListTile(
                title: Text(widget.theList[widget.index]),
                value: isSelected,
                onChanged: (bool val)  {
                  setState(() {
                    isSelected = val;
                    if (isSelected) {
                    DatabaseService(uid: user.uid).deleteListArr(widget.index);
                    }
                  });
                },
              ),
            ),
          ],
        );
      }
    }
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import "package:innovative_world/models/list_model.dart";

class DatabaseService {
  // Collection Reference
  CollectionReference listCollection = Firestore.instance.collection("list");

  // Get current users id
  final String uid;
  DatabaseService({this.uid});

  // Set data to firestore db
  Future setUserData(List<String> list) async {
    return await listCollection.document(uid).setData({ 
      "list": list
    });
  }

  // For deleting the lists
  Future deleteListArr(String index) async {
    return await listCollection.document(uid)
      .updateData({ "list": FieldValue.arrayRemove([index]) });
  }
  


  // UserList snapshot
  UserList _userListFromSnapshot(DocumentSnapshot snapshot) {
    return UserList(
      uid: uid, 
      list: snapshot.data["list"].cast<String>().toList()
      ); 
  } 
  // Stream for user's to do list
  Stream<UserList> get userListStream {
    return listCollection.document(uid).snapshots()
      .map(_userListFromSnapshot);
  }
}
import "package:flutter/material.dart";
import 'package:flutter/rendering.dart';
import "package:innovative_world/services/auth_service.dart";
import "package:innovative_world/models/list_model.dart";
import 'package:innovative_world/services/database_service.dart';
import "package:innovative_world/shared/decoration.dart";
import 'package:innovative_world/shared/loading.dart';
import 'package:provider/provider.dart';
import "package:innovative_world/models/user_model.dart";
import "package:innovative_world/models/list_model.dart";
import 'dart:async';

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  String _text;
  final _formKey = GlobalKey<FormState>();
  List<String> userDoc = [];
  // On every refresh the userDoc starts from 0, so it overrides the data

  @override
  Widget build(BuildContext context) {
    final user = Provider.of<UserId>(context);

    return StreamBuilder<UserList>(
        stream: DatabaseService(uid: user.uid).userListStream,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            UserList userList = snapshot.data;
            // List<String> userDoc = [userList.list.toString()];
            return Scaffold(
              backgroundColor: Colors.blue[200],
              appBar: AppBar(
                title: Text(
                  "Create List",
                  style: TextStyle(
                    fontSize: 23.0,
                  ),
                ),
                elevation: 0.0,
                actions: <Widget>[
                  FlatButton.icon(
                    onPressed: () {
                      AuthService().signOut();
                    },
                    icon: Icon(Icons.person),
                    label: Text("Sign out"),
                  ),
                ],
              ),
              body: Padding(
                padding: const EdgeInsets.fromLTRB(20.0, 25.0, 20.0, 0.0),
                child: Column(
                  children: <Widget>[
                    Form(
                      key: _formKey,
                      child: Column(
                        children: <Widget>[
                          TextFormField(
                            validator: (val) =>
                                val.isEmpty ? "Enter text" : null,
                            onChanged: (val) => setState(() => _text = val),
                            decoration: InputDecorationConst.copyWith(
                                hintText: "Create List..."),
                          ),
                          RaisedButton(
                            onPressed: () async {
                              if (_formKey.currentState.validate()) {
                                userDoc.add(_text);
                                _formKey.currentState.reset();
                                await DatabaseService(uid: user.uid)
                                    .setUserData(userDoc ?? userList.list);
                              }
                            },
                            color: Colors.pink,
                            child: Text(
                              "Add to list",
                              style: TextStyle(
                                  fontSize: 15.0, color: Colors.white),
                            ),
                          ),
                        ],
                      ),
                    ),
                    SizedBox(height: 15.0),
                    ListView.builder(
                      shrinkWrap: true,
                      itemCount: userList.list.length,
                      itemBuilder: (context, index) {
                        return ForList(listsIndex: userList.list[index], index: index, theList: userList.list);
                      },
                    ),
                  ],
                ),
              ),
            );
          } else {
            return Loading();
          }
        });
  }
}

class ForList extends StatefulWidget {
  final int index;
  final String listsIndex;
  final List<String> theList;

  ForList({ this.listsIndex, this.index, this.theList });

  @override
  _ForListState createState() => _ForListState();
}

class _ForListState extends State<ForList> {
  bool isSelected = false;

  @override
  Widget build(BuildContext context) {
    final user = Provider.of<UserId>(context);

    return Column(
      children: <Widget>[
        Card(
          child: CheckboxListTile(
            title: Text(widget.theList[widget.index]),
            value: isSelected,
            onChanged: (bool val) {
              setState(() {
                isSelected = val;
                Timer(Duration(seconds: 1), () {
                  setState(() async {
                  if (isSelected) {
                    await DatabaseService(uid: user.uid).deleteListArr(widget.listsIndex);
                   
                    }
                  });
                });
              });
            },
          ),
        ),
      ],
    );
  }
}