简体   繁体   English

从动态数据表 flutter 中获取选定的行索引

[英]get selected row index from dynamic datatable flutter

In flutter, I have dynamic widget data table.在 flutter 中,我有动态小部件数据表。 rows are added on submitting values (via edittextbox) with button.使用按钮在提交值(通过edittextbox)时添加行。 add and remove row on actions within row field(on clicking particular row).在行字段中添加和删除行(在单击特定行时)。 below code gives me output that removes last row from list.下面的代码给了我 output 从列表中删除最后一行。 i need to remove row that I clicked/selected row from table.我需要从表中删除我单击/选择的行。 it should found index of that row to remove that one.它应该找到该行的索引以删除该行。 is there alternative way to achieve the expected result?有没有其他方法可以达到预期的效果? I am using List<DataRow> row =[];我正在使用List<DataRow> row =[];

 Row(
          mainAxisAlignment: MainAxisAlignment.end,
          children: <Widget>[
       FlatButton.icon(
      color: Colors.orange,
      icon: Icon(FontAwesomeIcons.shoppingBag),
      label: Text('Add to List'), 

      onPressed: () async{
        ttl = int.parse(rate) * int.parse(noInputController.text);

         setState(() {

         this.row.add(
           new DataRow(
        cells: [
          DataCell( Icon(Icons.remove_circle, color: Colors.red,),
            //Text('remove', style: TextStyle(color: Colors.blue,decoration: TextDecoration.underline,),

        onTap: () {
       setState(() {
        //remove  item
        if(amt > 0){
        amt = amt - ttl;
        }
        print(amt);
        if (index  != -1){
        print("before: $index $rowindex");
       rowindex.removeAt(index);
       //row.removeAt(index);
       index = index - 1;
       print("after: $index $rowindex");
        }else{
          print('no rows');
        }

       });
      }),
        DataCell(Text(prd),
        onTap: () {
       setState(() {

       });
      }),
      DataCell(Text(noInputController.text),
      onTap: () {
      setState(() {

       });
      }),
      DataCell(Text(rate),
        onTap: () {
        setState(() {

       });
      }),
       DataCell(Text(ttl.toString()),
        onTap: () {
        setState(() {

       });
      }),
      DataCell(Text(stype),
        onTap: () {
        setState(() {

       });
      }),
        ]));
           print("before: $index $rowindex");
           index = index + 1;
            this.rowindex.add(index);
            print("after: $index $rowindex");
       // print(this.row.length);
         return this.row;
         });

         rstitem();  //get total
                }
    ),]),
        SizedBox(
          height: ScreenUtil.getInstance().setHeight(20),
        ),



         new SingleChildScrollView(
          scrollDirection: Axis.horizontal,
            child: DataTable(
  columns: [
    DataColumn(label: Text("Remove",style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15.0,color: Colors.blue))),
    DataColumn(  //tooltip: "item code for products",
          label: Text("Name",style: TextStyle(fontWeight: FontWeight.bold,fontSize: 15.0,color: Colors.blue))),
        DataColumn(label: Text("Quantity",style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15.0,color: Colors.blue))),
        DataColumn(label: Text("Rate",style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15.0,color: Colors.blue))),
        DataColumn(label: Text("Total",style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15.0,color: Colors.blue))),
        DataColumn(label: Text("Item Type",style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15.0,color: Colors.blue)))
  ],
  rows: row,
),),

help me fix this issue.帮我解决这个问题。

when delete data, please delete data in model list删除数据时,请删除model列表中的数据
code snippet代码片段

deleteSelected() async {
    setState(() {
      if (selectedUsers.isNotEmpty) {
        List<User> temp = [];
        temp.addAll(selectedUsers);
        for (User user in temp) {
          users.remove(user);
          selectedUsers.remove(user);
        }
      }
    });
  }

and in rows attribute use map并在行属性中使用 map

rows: users
            .map(
              (user) => DataRow(
              selected: selectedUsers.contains(user),
              onSelectChanged: (b) {
                print("Onselect");
                onSelectedRow(b, user);
              }

full code完整代码

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // This is the theme of your application.
        //
        // Try running your application with "flutter run". You'll see the
        // application has a blue toolbar. Then, without quitting the app, try
        // changing the primarySwatch below to Colors.green and then invoke
        // "hot reload" (press "r" in the console where you ran "flutter run",
        // or simply save your changes to "hot reload" in a Flutter IDE).
        // Notice that the counter didn't reset back to zero; the application
        // is not restarted.
        primarySwatch: Colors.blue,
      ),
      home: DataTableDemo(),
    );
  }
}



class User {
  String firstName;
  String lastName;

  User({this.firstName, this.lastName});

  static List<User> getUsers() {
    return <User>[
      User(firstName: "Aaryan", lastName: "Shah"),
      User(firstName: "Ben", lastName: "John"),
      User(firstName: "Carrie", lastName: "Brown"),
      User(firstName: "Deep", lastName: "Sen"),
      User(firstName: "Emily", lastName: "Jane"),
    ];
  }
}

class DataTableDemo extends StatefulWidget {
  DataTableDemo() : super();

  final String title = "Data Table Flutter Demo";

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

class DataTableDemoState extends State<DataTableDemo> {
  List<User> users;
  List<User> selectedUsers;
  bool sort;

  @override
  void initState() {
    sort = false;
    selectedUsers = [];
    users = User.getUsers();
    super.initState();
  }

  onSortColum(int columnIndex, bool ascending) {
    if (columnIndex == 0) {
      if (ascending) {
        users.sort((a, b) => a.firstName.compareTo(b.firstName));
      } else {
        users.sort((a, b) => b.firstName.compareTo(a.firstName));
      }
    }
  }

  onSelectedRow(bool selected, User user) async {
    setState(() {
      if (selected) {
        selectedUsers.add(user);
      } else {
        selectedUsers.remove(user);
      }
    });
  }

  deleteSelected() async {
    setState(() {
      if (selectedUsers.isNotEmpty) {
        List<User> temp = [];
        temp.addAll(selectedUsers);
        for (User user in temp) {
          users.remove(user);
          selectedUsers.remove(user);
        }
      }
    });
  }

  SingleChildScrollView dataBody() {
    return SingleChildScrollView(
      scrollDirection: Axis.vertical,
      child: DataTable(
        sortAscending: sort,
        sortColumnIndex: 0,
        columns: [
          DataColumn(
              label: Text("FIRST NAME"),
              numeric: false,
              tooltip: "This is First Name",
              onSort: (columnIndex, ascending) {
                setState(() {
                  sort = !sort;
                });
                onSortColum(columnIndex, ascending);
              }),
          DataColumn(
            label: Text("LAST NAME"),
            numeric: false,
            tooltip: "This is Last Name",
          ),
        ],
        rows: users
            .map(
              (user) => DataRow(
              selected: selectedUsers.contains(user),
              onSelectChanged: (b) {
                print("Onselect");
                onSelectedRow(b, user);
              },
              cells: [
                DataCell(
                  Text(user.firstName),
                  onTap: () {
                    print('Selected ${user.firstName}');
                  },
                ),
                DataCell(
                  Text(user.lastName),
                ),
              ]),
        )
            .toList(),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Column(
        mainAxisSize: MainAxisSize.min,
        mainAxisAlignment: MainAxisAlignment.center,
        verticalDirection: VerticalDirection.down,
        children: <Widget>[
          Expanded(
            child: dataBody(),
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              Padding(
                padding: EdgeInsets.all(20.0),
                child: OutlineButton(
                  child: Text('SELECTED ${selectedUsers.length}'),
                  onPressed: () {},
                ),
              ),
              Padding(
                padding: EdgeInsets.all(20.0),
                child: OutlineButton(
                  child: Text('DELETE SELECTED'),
                  onPressed: selectedUsers.isEmpty
                      ? null
                      : () {
                    deleteSelected();
                  },
                ),
              ),
            ],
          ),
        ],
      ),
    );
  }
}

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM