Flutter 从窗口小部件内的按键从列表中删除窗口小部件

Flutter 从窗口小部件内的按键从列表中删除窗口小部件,flutter,dart,Flutter,Dart,我有一个自定义TextFormField的列表,我在其中添加了一个删除图标 我所要做的就是当我按下删除按钮时,它将从列表和视图中删除 我尝试向表单字段添加函数,但没有成功 我认为我的方法不是实现我想要的东西的最佳方式,我愿意接受任何想法 这是密码 import 'package:flutter/material.dart'; typedef DeleteCallback = void Function(Key key); class DynamicFormField extends For

我有一个自定义TextFormField的列表,我在其中添加了一个删除图标 我所要做的就是当我按下删除按钮时,它将从列表和视图中删除

我尝试向表单字段添加函数,但没有成功

我认为我的方法不是实现我想要的东西的最佳方式,我愿意接受任何想法

这是密码


import 'package:flutter/material.dart';
typedef DeleteCallback = void Function(Key key);

class DynamicFormField extends  FormField<String>{
  DynamicFormField({
    Key key,
    FormFieldSetter<String> onSaved,
    FormFieldValidator<String> validator,
    String initialValue = "",
    bool autovalidate = false,
    DeleteCallback onDelete(Key key),
  }) : super(
    onSaved: onSaved,
    validator: validator,
    initialValue: initialValue,
    autovalidate: autovalidate,
    builder: (FormFieldState<String> state) {
      return  Row(
          mainAxisSize: MainAxisSize.min,

          children: <Widget>[
            Expanded(
              flex: 5,
              child: TextFormField(
                decoration: const InputDecoration(
          hintText: 'Enter Player Name',
        ),
                onSaved: onSaved,
                validator: validator,
                initialValue: initialValue,
                autovalidate: autovalidate,

                ),
            ),
            IconButton(
            icon: Icon(Icons.delete_outline),
            onPressed: onDelete(key)
          ),
          ],
      );
    }
  );
}



我用ListView builder解决了这个问题

导入“包装:颤振/材料.省道”;
导入“包:rummy/models/player.dart”;
导入“包:rummy/screens/game_screen.dart”;
类NewGame扩展StatefulWidget{
NewGame({Key}):超级(Key:Key);
@凌驾
_NewGameState createState();
}
类_NewGameState扩展状态{
final _formKey=GlobalKey();
列表字段;
列出参与者名单;
_新游戏状态(){
players=新列表();
字段=新列表();
印刷(玩家);
add(generateField());
}
Widget generateField(){
返回TextFormField(
装饰:常量输入装饰(
hintText:'输入玩家名称',
),
onSaved:(输入)=>{players.add(Player(输入))},
验证器:(值){
if(value.isEmpty){
返回“请输入一些文本”;
}
返回null;
},
);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:SizedBox.expand(
孩子:填充(
填充:常数边集全部(12.0),
子:列(
儿童:[
形式(
键:_formKey,
儿童:扩大(
子:ListView(
儿童:[
大小盒子(
高度:MediaQuery.of(context).size.height,
孩子:建筑工人(
生成器:(BuildContext上下文){
返回ListView.builder(
滚动方向:轴垂直,
收缩膜:对,
itemCount:fields.length,
项目生成器:
(BuildContext上下文,int position){
返回行(
mainAxisSize:mainAxisSize.min,
儿童:[
扩大(
子项:字段[职位],
),
图标按钮(
图标:图标(图标。删除轮廓),
按下:()=>{
设置状态(){
印刷(职位);
字段。移除(位置);
})
}),
],
);
},
);
},
),
)
],
),
)),
划船(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
升起的按钮(
已按下:(){
印刷品(“asdasd”);
if(_formKey.currentState.validate()){
玩家。清除();
_formKey.currentState.save();
导航器。推(
上下文
材料路线(
生成器:(上下文)=>游戏屏幕(玩家),
));
}否则
打印(_formKey.currentState.validate());
},
子项:文本('Submit'),
),
升起的按钮(
已按下:(){
设置状态(){
add(generateField());
});
},
子项:文本(“添加新玩家”),
),
],
),
],
mainAxisAlignment:mainAxisAlignment.center,
),
),
),
);
}

}
我认为这里缺少一些信息。我不知道在DynamicFormField构造中如何涉及fields变量。根据当前代码,我想说的是,您试图删除的密钥与任何fields.item之间没有链接。也许您应该将key:item.key而不是UniqueKey()(每次都会生成一个新的key)传递给DynamicFormField。希望帮助您查看小部件中的更改,您需要重新绘制小部件。要触发重画函数,您需要将字段添加到小部件的状态中,当调用delete时,只需执行
setState(()=>fields.removeWhere((item)=>item.key==key))
(或者更好的操作-
setState(()=>fields=fields.filter((item)=>item.key==key))
)我所做的问题是f没有编译。。。
DynamicFormField(
        key: UniqueKey(),
        validator: (value) {
          if (value.isEmpty) {
            return 'Please enter some text';
          }
          return null;
        },
        onSaved: (input) => {players.add(Player(input))},
        onDelete: f,
      ),
    );
  }
  void f(Key key){
      fields.removeWhere((item) => item.key == key);
  }