Firebase 颤振,FieldValue.removeArray()不工作
我正试图从firestore db中的列表中删除元素,但它不起作用。我发现奇怪的是FieldValue.arrayUnion()和FieldValue.delete()工作正常。为什么FieldValue.arrayRemove()是唯一不起作用的?谢谢 数据库服务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/
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);
}
});
});
});
},
),
),
],
);
}
}