微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

正在删除多个索引但我只想删除选中的索引 Flutter, dart

如何解决正在删除多个索引但我只想删除选中的索引 Flutter, dart

我试图在按下“删除”Flatbutton 时删除特定的 ExtraItem。一切似乎都与被删除的索引有关。但是,它还会从 UI 中删除/清除其他先前添加的文本(我不想要)。如何修复之前添加的所有其他文本的清除?

测试用例 1 删除索引 0 之前:before deletion
删除索引 0 后:after deletion

测试用例 2 删除索引 1 之前:before deletion 删除索引 1 后:after deletion

这是我的代码,其他用于复制

class ExtraItem extends StatefulWidget {
  bool isLast = false;
  final VoidCallback onExtraAdded;
  final VoidCallback onNameChanged;
  final VoidCallback onPriceChanged;
  final VoidCallback onDeleteClicked;
  final ExtraItem extra;
  String name;

  int price;
  int index;
  ExtraItem({
    Key key,this.isLast,this.onExtraAdded,this.extra,this.index,this.onNameChanged,this.onPriceChanged,this.onDeleteClicked,}) : super(key: key);

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

class _ExtraItemState extends State<ExtraItem> {
  String type;

  TextEditingController nameController = TextEditingController();

  TextEditingController priceController = TextEditingController();

  @override
  void dispose() {
    nameController.dispose();
    priceController.dispose();
    super.dispose();
  }

  _showExtrasDialog() async {
    await showDialog<String>(
      context: this.context,child: new _SystemPadding(
        child: new AlertDialog(
          title: Text(
            'Modify Extras ',style: TextStyle(fontFamily: "Montserrat Medium",fontSize: 15),),contentPadding: const EdgeInsets.all(16.0),content: new Row(
            children: <Widget>[],actions: <Widget>[
            new FlatButton(
                child: const Text('CANCEL'),onpressed: () {
                  Navigator.pop(this.context);
                }),new FlatButton(
                child: const Text('ADD EXTRA'),onpressed: () {
                  setState(() {
                    widget.onExtraAdded();
                  });
                  Navigator.pop(this.context);
                }),//this is also for the modal
            new FlatButton(
                child: const Text('REMOVE'),onpressed: () {
                  setState(() {
                    widget.onDeleteClicked();
                  });
                  Navigator.pop(this.context);
                })
          ],);
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Padding(
        padding: const EdgeInsets.only(bottom: 5,top: 5),child: Row(
          mainAxisAlignment: MainAxisAlignment.start,children: [
            Expanded(
              child: Container(
                width: 144,height: 49,decoration:
                    Boxdecoration(borderRadius: BorderRadius.circular(4)),child: Center(
                  child: Padding(
                    padding: const EdgeInsets.only(left: 0),child: TextField(
                      autofocus: true,controller: nameController,onChanged: (value) {
                        print("changing");
                        widget.name = value;
                        widget.onNameChanged();
                      },scrollPadding: EdgeInsets.all(0),decoration: Inputdecoration(
                        focusedBorder: OutlineInputBorder(
                            borderSide: const BorderSide(
                                width: 1,color: Color(0xff2E2E2E))),isDense: true,enabledBorder: OutlineInputBorder(
                            borderSide: const BorderSide(
                                width: 1,color: Color(0xffDEDEDE))),SizedBox(
              width: 10,Expanded(
              child: Container(
                width: 144,controller: priceController,onChanged: (value) {
                        print("changing");
                        widget.price = int.parse(value);
                        widget.onPriceChanged();
                      },decoration: Inputdecoration(
                        hintText: "\$",hintStyle: TextStyle(
                            color: sankaraGreyColor,fontFamily: "Montserrat Medium",focusedBorder: OutlineInputBorder(
                            borderSide: const BorderSide(
                                width: 1,isDense: false,// widget.isLast
            //     ?
            Padding(
              padding: const EdgeInsets.symmetric(horizontal: 5),child: Column(
                mainAxisAlignment: MainAxisAlignment.start,crossAxisAlignment: CrossAxisAlignment.center,children: [
                  GestureDetector(
                    child: Container(
                      width: 20,height: 20,child: Center(
                        child: Text("+",style: TextStyle(
                                fontFamily: "Montserrat Medium",fontSize: 15,color: sankaraGreyColor)),decoration: Boxdecoration(
                          shape: BoxShape.circle,border: Border.all(color: Color(0xffDEDEDE))),onTap: () {
                      setState(() {
                        _showExtrasDialog();
                      });
                    },Padding(
                    padding: const EdgeInsets.only(top: 5),child: Text(
                      "Modify",style: TextStyle(
                          fontFamily: "Montserrat Medium",fontSize: 7),)
                ],)
            // : Padding(
            //     padding: const EdgeInsets.symmetric(horizontal: 12),//     child: Column(
            //       mainAxisAlignment: MainAxisAlignment.start,//       crossAxisAlignment: CrossAxisAlignment.center,//       children: [
            //         Container(
            //           width: 20,//           height: 20,//         ),//       ],//     ),//   )
          ],);
  }
}

这里发生交互

class ThirdPage extends StatefulWidget {
  Function(List<ExtraItem>) onExtrasChanged;
  Function(List<ExtraItem>) onDrinksChanged;
  Function(List<ExtraItem>) onSidesChanged;
  Function(int) onExtrasRemoved;

  ThirdPage(
      {this.onExtrasChanged,this.onDrinksChanged,this.onSidesChanged,this.onExtrasRemoved});

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

class _ThirdPageState extends State<ThirdPage> {
  List<ExtraItem> extras = [];
  List<ExtraItem> drinks = [];
  List<ExtraItem> sides = [];

  void addDrinksItem() {
    print("adding drink");
    for (int i = 0; i < drinks.length; i++) {
      setState(() {
        drinks[i].isLast = false;
      });
    }
    setState(() {
      drinks.add(ExtraItem(
        onExtraAdded: () {
          addDrinksItem();
        },onNameChanged: () {
          widget.onDrinksChanged(drinks);

          printDrinkValues();
        },onPriceChanged: () {
          widget.onDrinksChanged(drinks);

          printDrinkValues();
        },isLast: true,index: drinks.length,));
    });
  }



  void _deleteItem(int index) {
    print(index);
    setState(() {
     extras.removeAt(index);
     });
    
  }

  @override
  void initState() {
    addExtraItem();
    addDrinksItem();
    addSidesItem();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        GestureDetector(
          onTap: () {
            print(extras[0].isLast);
          },child: Container(
            width: 380,height: 600,decoration: Boxdecoration(
                borderRadius: BorderRadius.circular(4),border: Border.all(color: Color(0xffECECEC))),child: Padding(
              padding: const EdgeInsets.only(left: 20,right: 0,top: 30),child: ListView(
                physics: NeverScrollableScrollPhysics(),padding: EdgeInsets.symmetric(horizontal: 0),shrinkWrap: true,scrollDirection: Axis.vertical,children: [
                  GestureDetector(
                    onTap: () {
                      printExtraValues();
                    },child: Text(
                      "Customize your menu",fontSize: 20,color: Colors.black),Padding(
                    padding: const EdgeInsets.only(top: 5,bottom: 20),child: Text(
                      "Include any add-ons,if any",style: TextStyle(
                          fontFamily: "Montserrat Regular",fontSize: 12,color: sankaraGreyColor),Padding(
                    padding: const EdgeInsets.only(bottom: 10),child: Text(
                      "MealBox item as extra",Row(
                    mainAxisAlignment: MainAxisAlignment.start,crossAxisAlignment: CrossAxisAlignment.start,children: [
                      Container(
                        width: 144,child: Text(
                          "Name",style: TextStyle(
                              fontFamily: "Montserrat Medium",fontSize: 10,SizedBox(
                        width: 16,Container(
                        width: 144,child: Text(
                          "Price Per Item",],Container(
                    child: ListView.builder(
                      physics: NeverScrollableScrollPhysics(),itemCount: extras.length,itemBuilder: (context,index) {
                        int ind = index;
                        final extra = extras[index];
                        return ExtraItem(
                          key: ObjectKey(extra),extra: extras[index],onExtraAdded: () => addExtraItem(),onDeleteClicked: () => _deleteItem(ind),);
                      },

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?