Вставить операцию в 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 methodvoid main() => runApp(InsertDataTable());// Class person that initialize the data fieldsclass 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, имеют свою метку, наконец, строки отображаются списком.