Firebase 删除以前的值并在firestore列表中添加新值
在firestore中,我想用用户输入的新值更新列表,并删除所有以前的值。假设用户添加2个新值[美式英语、法语]。我想要的是删除列表中的所有值,并用这些值更新列表。我使用了set和update方法,它只是在较新的索引中添加新值,而不是删除以前的索引 这是我的密码Firebase 删除以前的值并在firestore列表中添加新值,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,在firestore中,我想用用户输入的新值更新列表,并删除所有以前的值。假设用户添加2个新值[美式英语、法语]。我想要的是删除列表中的所有值,并用这些值更新列表。我使用了set和update方法,它只是在较新的索引中添加新值,而不是删除以前的索引 这是我的密码 addCategoriesAndSkillsInDB({List categories, List skills}) async { print('$skills'); categories == null
addCategoriesAndSkillsInDB({List categories, List skills}) async {
print('$skills');
categories == null
? _firestore
.collection('users')
.doc(getCurrentUser().uid)
.set({'skills': skills})
: _firestore
.collection('users')
.doc(getCurrentUser().uid)
.update({'categories': FieldValue.arrayUnion(categories)});
}
这就是我在列表中保留新值的方式
import 'file:///E:/flutterProject/filmmaker/lib/auth_screens/signUp_screens/worker/signUp_screen5.dart';
import 'package:filmmaker/auth_screens/signUp_screens/worker/signUp_screen14.dart';
import 'package:filmmaker/logic/bloc/fields/fields_bloc.dart';
import 'package:filmmaker/resources/repo/firebase_repo.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class SignUpScreen4 extends StatefulWidget {
bool edit = false;
SignUpScreen4([this.edit]);
@override
_SignUpScreen4State createState() => _SignUpScreen4State();
}
class _SignUpScreen4State extends State<SignUpScreen4> {
List<String> _dynamicChips = [];
String _value;
final key = GlobalKey<FormState>();
final controller = TextEditingController();
@override
void dispose() {
// TODO: implement dispose
super.dispose();
controller.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Sign Up Screen 4'),
Form(
key: key,
child: TextFormField(
controller: controller,
validator: (value) =>
value.trim().isEmpty || value == null ? 'Empty Text' : null,
autofocus: true,
autocorrect: true,
enableSuggestions: true,
decoration: InputDecoration(
hintText:
'Type things like: Final Cut Pro, or Documentary making',
hintStyle: TextStyle(fontStyle: FontStyle.italic),
labelText: 'Tell us about some of your skills',
),
),
),
MaterialButton(
onPressed: () {
if (key.currentState.validate()) {
if (!_dynamicChips.contains(controller?.text)) {
setState(() {
_value = controller?.text;
});
_dynamicChips.add(_value);
controller.text = '';
}
}
},
child: Text("Add"),
),
dynamicChips(),
BlocConsumer<FieldsBloc, FieldsState>(builder: (context, state) {
if (state is FieldsInitial) {
return Container();
} else if (state is FieldSuccessfulState) {
return Container();
} else if (state is FieldUnsuccessfulState) {
return Padding(
padding: const EdgeInsets.all(15.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.error,
color: Colors.red,
),
SizedBox(
width: 5.0,
),
Text(
state.message,
style: TextStyle(color: Colors.red),
),
],
));
}
return Container();
}, listener: (context, state) {
if (state is FieldSuccessfulState)
widget.edit
? Navigator.of(context).push(
MaterialPageRoute(builder: (_) => SignUpScreen14()))
: Navigator.of(context).push(
MaterialPageRoute(builder: (_) => SignUpScreen5()));
}),
ElevatedButton(
onPressed: () {
BlocProvider.of<FieldsBloc>(context)
.add(NextButtonEventScreen4(_dynamicChips));
},
child: Text('Next'))
],
),
),
);
}
dynamicChips() {
return Wrap(
spacing: 6.0,
runSpacing: 6.0,
children: List<Widget>.generate(
_dynamicChips?.length,
(int index) => Chip(
label: Text(_dynamicChips[index]),
onDeleted: () {
setState(() {
_dynamicChips.removeAt(index);
});
},
)),
);
}
}
导入'file:///E:/flutterProject/filmmaker/lib/auth_screens/signUp_screens/worker/signUp_screen5.dart';
导入“包装:电影制作人/auth_screens/signUp_screens/worker/signUp_screen14.dart”;
导入“包:filmmaker/logic/bloc/fields/fields_bloc.dart”;
导入“包:filmmaker/resources/repo/firebase_repo.dart”;
进口“包装:颤振/材料.省道”;
进口“包装:颤振团/颤振团.飞镖”;
类SignUpScreen4扩展StatefulWidget{
bool edit=false;
SignUpScreen4([this.edit]);
@凌驾
_SignUpScreen4State createState()=>_SignUpScreen4State();
}
类_SignUpScreen4State扩展状态{
列表_dynamicChips=[];
字符串_值;
final key=GlobalKey();
最终控制器=文本编辑控制器();
@凌驾
无效处置(){
//TODO:实现dispose
super.dispose();
controller.dispose();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
主体:填充物(
填充:常数边集全部(20.0),
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
文本(“注册屏幕4”),
形式(
钥匙:钥匙,
子项:TextFormField(
控制器:控制器,
验证程序:(值)=>
value.trim().isEmpty | | value==null?“空文本”:null,
自动对焦:对,
自动更正:正确,
使能建议:正确,
装饰:输入装饰(
hintText:
“键入诸如:最终剪辑专业版或纪录片制作”之类的内容,
hintStyle:TextStyle(fontStyle:fontStyle.italic),
labelText:“告诉我们你的一些技能”,
),
),
),
材料按钮(
已按下:(){
if(key.currentState.validate()){
如果(!\u dynamicChips.contains(controller?.text)){
设置状态(){
_值=控制器?.text;
});
_动态芯片。添加(_值);
controller.text='';
}
}
},
子项:文本(“添加”),
),
动态芯片(),
BlocConsumer(生成器:(上下文,状态){
如果(状态为FieldSintial){
返回容器();
}else if(状态为FieldSuccessfulState){
返回容器();
}否则如果(状态为FieldUnsuccessfulState){
返回填充(
填充:常数边集全部(15.0),
孩子:排(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
图标(
错误,
颜色:颜色,红色,
),
大小盒子(
宽度:5.0,
),
正文(
state.message,
样式:TextStyle(颜色:Colors.red),
),
],
));
}
返回容器();
},侦听器:(上下文,状态){
如果(状态为FieldSuccessfulState)
widget.edit
导航器(上下文)。推送(
MaterialPackageRoute(生成器:()=>SignUpScreen14())
:Navigator.of(context).push(
MaterialPackageRoute(生成器:()=>SignUpScreen5());
}),
升降按钮(
已按下:(){
BlocProvider.of(上下文)
.add(NextButtonEventScreen4(_dynamicChips));
},
子项:文本('Next'))
],
),
),
);
}
动态芯片(){
回程包装(
间距:6.0,
运行间距:6.0,
子项:List.generate(
_动态芯片?长度,
(int索引)=>芯片(
标签:文本(_dynamicChips[index]),
已删除:(){
设置状态(){
_动态芯片移除(索引);
});
},
)),
);
}
}
您需要传递列表
,而不是字符串
。比如说
List<String> languages = ['English', 'Nepali', 'hindi'];
在更新到firestore之前,请尝试打印(其他语言)。。。并确认是否只是添加的新值的列表。。。或者,若它是一个添加值和以前值的列表,“它只是在较新的索引中添加新值,而不是删除以前的值”,那个么您共享的代码中并没有任何内容可以解释这种行为。再说一遍,我们无法知道如何初始化
otherLanguage
,因此问题可能就在这里。请编辑您的问题以包括。我已经检查过,并且otherLanguage在列表中包含较新的值,而不是以前的值。但是firestore中的新值正在与旧值合并。我只想删除旧值并在列表中维护新值。我已经找到了解决方案。更新方法很好,我只需要重新安装应用程序,一切都很好
_firestore
.collection('users')
.doc(getCurrentUser().uid)
.update({'other languages': languages});