【问题标题】:Flutter: Deleting widget with delete icon from a list view in flutter颤振:从颤动的列表视图中删除带有删除图标的小部件
【发布时间】:2020-11-16 17:54:46
【问题描述】:

我有一个表单构建器应用程序,我有添加到列表视图的无状态小部件,每个小部件都有一个删除图标,我想删除小部件并更新列表视图。

其中一个代码小部件代码是这样的

class HeaderTextWidget extends StatelessWidget {
  final VoidCallback onDelete;

  HeaderTextWidget({Key key, this.onDelete}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      margin: EdgeInsets.only(bottom: 12.0),
      decoration: BoxDecoration(
        color: Colors.blueGrey,
        borderRadius: BorderRadius.only(
          topRight: Radius.circular(15.0),
          topLeft: Radius.circular(15.0),
        ),
      ),
      child: Column(
        children: <Widget>[
          Padding(
            padding: EdgeInsets.all(6.0),
            child: Text(
              'Header',
              style: TextStyle(
                color: Colors.white,
                fontSize: 18.0,
              ),
            ),
          ),
          Card(
            elevation: 5.0,
            color: Colors.blueGrey.shade50,
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.only(
                topLeft: Radius.circular(15.0),
                topRight: Radius.circular(15.0),
              ),
            ),
            child: Column(
              children: <Widget>[
                Padding(
                  padding: const EdgeInsets.fromLTRB(8.0, 10.0, 8.0, 10.0),
                  child: TextField(
                    textCapitalization: TextCapitalization.words,
                    keyboardType: TextInputType.text,
                    style: TextStyle(
                      fontSize: 18.0,
                      fontWeight: FontWeight.bold,
                    ),
                    decoration: InputDecoration(
                      hintText: 'untitled header',
                      hintStyle: TextStyle(
                        color: Colors.grey,
                        fontStyle: FontStyle.italic,
                        fontSize: 14.0,
                      ),
                    ),
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.fromLTRB(8.0, 4.0, 8.0, 20.0),
                  child: TextField(
                    textCapitalization: TextCapitalization.words,
                    keyboardType: TextInputType.text,
                    style: TextStyle(
                      fontSize: 14.0,
                      fontWeight: FontWeight.normal,
                    ),
                    decoration: InputDecoration(
                      hintText: 'Description (optional)',
                      hintStyle: TextStyle(
                        color: Colors.grey,
                        fontSize: 14.0,
                      ),
                    ),
                  ),
                ),
                Divider(
                  indent: 4.0,
                  endIndent: 4.0,
                  thickness: 2.0,
                ),
                IntrinsicHeight(
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.end,
                    children: <Widget>[
                      IconButton(
                        icon: Icon(Icons.content_copy),
                        iconSize: 24.0,
                        color: Colors.blue,
                        onPressed: () {
                          Scaffold.of(context).showSnackBar(
                            SnackBar(
                              content: Text('COpy'),
                            ),
                          );
                        },
                      ),
                      IconButton(
                        icon: Icon(Icons.delete),
                        iconSize: 24.0,
                        color: Colors.red,
                        onPressed: this.onDelete,
                      ),
                      VerticalDivider(
                        thickness: 2.0,
                        endIndent: 6.0,
                        indent: 4.0,
                      ),
                      Padding(
                        padding: const EdgeInsets.only(right: 12.0),
                        child: SwitchWidget(),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}  

这是我的列表视图构建器

body: Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: <Widget>[
                FormBuilder(
                    key: widget.fbKey,
                    autovalidate: true,
                    child: Expanded(
                      child: Padding(
                        padding: const EdgeInsets.all(10.0),
                        child: ListView.builder(
                          itemCount: widget.data.widgets.length,
                          controller: _scrollController,
                          itemBuilder: (context, index) {
                            return widget.data.widgets[index];
                          },
                        ),
                      ),
                    )),
              ],
            ),
          );  

这是添加小部件的方式,当单击该特定图标时,视图将从选定的小部件更改为列表视图构建器页面。应该在哪里添加删除功能,在列表视图中还是在小部件本身中?

Scaffold(
            appBar: AppBar(
              title: Text('Form Widgets'),
            ),
            body: LayoutBuilder(
              builder:
                  (BuildContext context, BoxConstraints viewPointConstrainsts) {
                return SingleChildScrollView(
                  padding: EdgeInsets.all(12.0),
                  child: ConstrainedBox(
                    constraints: BoxConstraints(
                      minHeight: viewPointConstrainsts.maxHeight,
                    ),
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.spaceAround,
                      children: <Widget>[
                        Row(
                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
                          children: <Widget>[
                            FormWidget(
                              key: UniqueKey(),
                              iconData: Icons.title,
                              widgetTxT: 'Header',
                              onTap: () {
                                setState(() {
                                  widget.data.widgets.add(HeaderTextWidget());
                                  widget.pickWidgetsView = false;
                                });
                              },
                            ),

【问题讨论】:

  • 你到底想要什么?删除功能放在哪里?
  • @HardikKumar 我想使用删除图标从 Listview 中删除小部件,当我在特定小部件上实现删除功能时无法获取索引。
  • 您究竟是如何创建widget.data 列表来存储所有小部件的?您应该只存储数据模型而不是小部件。
  • @SanjaySharma 是的,我确实有一个模型类,它只返回 List widgets = [];
  • @SanjaySharma 我会试一试,然后会回复你。非常感谢您的帮助!

标签: flutter widget


【解决方案1】:

尝试以下方法:

  1. 仅存储数据,而不是 Widget 本身在列表中
List<DataModel> data = []
  1. 使用createListViewItem() 创建列表视图项,它应该返回如下小部件
ListView.builder(
  itemCount: widget.dataList.length,
  controller: _scrollController,
  itemBuilder: (context, index) {
    return createListViewItem(index);
  },
),
  1. 现在在createListViewItem(index) 中,您可以按照widget.dataList[index] 创建数据并通过单击删除图标删除列表项
setState(){
   widget.dataList.deleteAt(index);
}

【讨论】:

  • 你提到的dataList到底是什么?
  • 创建列表项的数据模型列表
  • 你创建空列表,如 List data = [ ];并再次创建相同模型的另一个数据列表?
  • 仅将您的小部件列表替换为 DataModel 列表并使用它来创建列表项
  • 我得到的错误是,不能从方法“createListViewItems”返​​回“DataModel”类型的值,因为它的返回类型为“Widget”
猜你喜欢
  • 2019-08-04
  • 2021-06-02
  • 2020-12-23
  • 2019-05-05
  • 2022-01-14
  • 2019-10-28
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
相关资源
最近更新 更多