【问题标题】:get selected row index from dynamic datatable flutter从动态数据表颤振中获取选定的行索引
【发布时间】:2020-02-15 11:40:39
【问题描述】:

在颤振中,我有动态小部件数据表。使用按钮在提交值(通过edittextbox)时添加行。在行字段中添加和删除行(在单击特定行时)。下面的代码给了我从列表中删除最后一行的输出。我需要从表中删除我单击/选择的行。它应该找到该行的索引以删除该行。有没有其他方法可以达到预期的效果? 我正在使用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,
),),

帮我解决这个问题。

【问题讨论】:

    标签: android flutter dart datatables flutter-layout


    【解决方案1】:

    删除数据时,请删除模型列表中的数据
    代码sn-p

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

    在行属性中使用地图

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

    完整代码

    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();
                      },
                    ),
                  ),
                ],
              ),
            ],
          ),
        );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-11-17
      • 1970-01-01
      • 2021-11-09
      • 2021-03-26
      • 1970-01-01
      • 2019-01-29
      • 2021-06-07
      • 2019-04-20
      • 2022-10-06
      相关资源
      最近更新 更多