Firebase 删除以前的值并在firestore列表中添加新值

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

在firestore中,我想用用户输入的新值更新列表,并删除所有以前的值。假设用户添加2个新值[美式英语、法语]。我想要的是删除列表中的所有值,并用这些值更新列表。我使用了set和update方法,它只是在较新的索引中添加新值,而不是删除以前的索引

这是我的密码

     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});