Вставить операцию в DataTable во Flutter
DataTable — это дизайн материалов, используемый для отображения данных в таблице или в строках и столбцах. Таблица данных используется для отображения данных, которые имеют столбцы и строки в качестве дочерних, столбец используется для установки имени столбца, а строка используется для установки значений столбцов. Любой столбец в DataTable может быть отсортирован на его основе в порядке возрастания или убывания. Если sortColumnIndex не равен нулю, таблица будет отсортирована в соответствии со значениями в указанном столбце. Порядок сортировки определяется логическим флагом sortAscending. В этой статье мы увидим, как мы можем создать пользовательский интерфейс для заполнения DataTable.
Для получения дополнительной информации см. Учебник по Dart .
Создание данных класса
Используется для создания объектов из класса, чтобы избежать дублирования
Например:
Product P1-new Product(1, "PName");
Начиная
Первое создание переменных данных, которые нам нужны, с использованием var или Set Type(int, String)
var Var1, Var2;
Создание конструктора, который устанавливает данные и должен иметь то же имя, что и класс,
ClassName( this.Var1, this.Var1,);
Синтаксис:
class ClassName { final int Col1; final String Col2; ClassName(this.Col1, this.Col2,); }
Код вставки
Из-за того, что данные извлекаются из списка, Insert будет новым объектом в списке.
ClassName Obj = ClassName(Col1); List.add(Obj);
Код таблицы данных
DataTable( columns: [ DataColumn(label: Text("Col1"),), rows: List.map((p) => DataRow(cells:[ DataCell (Text(p.Col.toString()),), ]), ] )
Пример кода
Dart
import "package:flutter/material.dart" ; // Main method void main() => runApp(InsertDataTable()); // Class person that initialize the data fields class Persons { int ID, Age; String Name, LastName; Persons( this .ID, this .Name, this .LastName, this .Age); } class InsertDataTable extends StatefulWidget { @override _InsertDataTableState createState() => new _InsertDataTableState(); } class _InsertDataTableState extends State<InsertDataTable> { List<Persons> PersonsLst = <Persons>[ Persons(1, "Alex" , "Anderson" , 18), Persons(2, "John" , "Anderson" , 24), ]; final formKey = new GlobalKey<FormState>(); var ID_Controller = new TextEditingController(); var Name_Controller = new TextEditingController(); var LastName_Controller = new TextEditingController(); var Age_Controller = new TextEditingController(); var lastID = 2; @override // Method that call only once to initiate the default app. void initState() { super.initState(); lastID++; ID_Controller.text = lastID.toString(); } // Method that is used to refresh the UI and show the new inserted data. refreshList() { setState(() { ID_Controller.text = lastID.toString(); }); } // Method used to validate the user data validate() { if (formKey.currentState!.validate()) { formKey.currentState!.save(); String ID = ID_Controller.text; String N = Name_Controller.text; String LN = LastName_Controller.text; String A = Age_Controller.text; Persons p = Persons( int .parse(ID), N, LN, int .parse(A)); PersonsLst.add(p); lastID++; refreshList(); Name_Controller.text = "" ; LastName_Controller.text = "" ; Age_Controller.text = "" ; } } // Method to check the value of age, age is int or not bool NotIntCheck(var N) { final V = int .tryParse(N); if (V == null) { print( "Not Int" ); return true ; } else { print( "Int" ); return false ; } } @override Widget build(BuildContext context) { return MaterialApp( // MaterialApp with home as scaffold home: Scaffold( appBar: AppBar( title: Text( "Insert Into Data Table" ), ), body: ListView( children: <Widget>[ Form( key: formKey, child: Padding( padding: EdgeInsets.all(15.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ Text( "Person ID:" ), TextField( controller: ID_Controller, enabled: false , ), Text( "Person Name:" ), TextFormField( controller: Name_Controller, keyboardType: TextInputType.text, validator: (val) => val?.length == 0 ? "Enter Person Name" : null, ), Text( "Person Last Name:" ), TextFormField( controller: LastName_Controller, keyboardType: TextInputType.text, validator: (val) => val?.length == 0 ? "Enter Person LastName" : null, ), Text( "Person Age:" ), TextFormField( controller: Age_Controller, maxLength: 2, keyboardType: TextInputType.number, validator: (val) => NotIntCheck(val) ? "Enter Person Age,Number Required" : null, ), SizedBox( width: double .infinity, child: MaterialButton( color: Colors.green, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), child: Text( "Insert Person" , style: TextStyle( color: Colors.white, ), ), onPressed: validate, ), ), ], ), ), ), SingleChildScrollView( scrollDirection: Axis.horizontal, child: DataTable( columns: [ DataColumn( label: Text( "ID" ), ), DataColumn( label: Text( "Name" ), ), DataColumn( label: Text( "LastName" ), ), DataColumn( label: Text( "Age" ), ), ], rows: PersonsLst.map( (p) => DataRow(cells: [ DataCell( Text(p.ID.toString()), ), DataCell( Text(p.Name), ), DataCell( Text(p.LastName), ), DataCell( Text(p.Age.toString()), ), ]), ).toList(), ), ), ], ), ), ); } } |
Выходной интерфейс:
Код Пояснение
- main — это основной метод, вызываемый после загрузки программы.
- После загрузки программы runApp запустится и вызовет созданный нами класс (InsertDataTable) для выполнения.
- Перед созданием InsertDataTable нам нужно создать классы, которые создают объекты.
- Создание лиц класса, используемых для создания объектов-лиц.
- Создание информационных переменных ID, возраста, целочисленного типа, имени и фамилии в виде строки.
- Создание конструктора, который устанавливает информацию о каждом объекте, имеет одно и то же имя класса.
- Теперь начните создание основного класса InsertDataTable с сохранением состояния из-за изменения состояния (выборка новых данных) и создание его состояния.
- Создание списка PersonsList, который будет содержать объекты Person, содержащие 2 объекта Person.
- Создание формы, которая будет проверять каждое значение TextField , чтобы избежать сохранения неправильных или нулевых данных.
- Из-за того, что пользователь может вставлять свои собственные данные, нам нужно создать TextEditingControllers для получения данных.
- Создание переменной LastID, инициализированной до 2 из-за 2 объектов, созданных в PersonsList в начале, после вставки мы увеличим идентификатор.
- Как только страница загружена, мы инициализируем ее состояние и увеличиваем LastID, чтобы получить номер 3, и помещаем это значение в контроллер ID TextField.
- Создайте RefreshList, который обновляет данные DataTable, взятые из PersonsList, и установите новый идентификатор для TextField (увеличивается при нажатии кнопки «Вставить» после проверки).
- Создайте метод проверки, который проверяет, проверено ли оно. Если подтверждено, то мы принимаем каждое значение, введенное пользователем, и добавляем его в список в объект.
- После добавления новых лиц объекта, увеличения идентификатора, очистки поля и обновления списка, чтобы принять новый объект.
- Из-за того, что возраст является целым числом, нам нужно проверить значение, мы создаем метод, который будет проверять его всякий раз, когда целое или нет, возвращая true или false.
- Тело содержит ListView , который позволяет прокручивать и избегать переполнения. Представление списка принимает форму , известную по ее ключу (используется для проверки формы (все текстовые поля)), используя столбец, помещающий тексты, текстовые поля и кнопку.
- Каждое поле TextFormField имеет свой контроллер (используется для вставки данных) и валидатор, который проверяет данные (длина 0, если символы не были вставлены, проверьте, если int в возрасте) с сообщением об ошибке, которое будет отображаться в случае ошибки.
- SingleChildScrollView принимает Single Child DataTable, который принимает столбцы и строки.
- Столбцы, принимающие DataColumns, имеют свою метку, наконец, строки отображаются списком.