在哪里放置一个函数来填充表中的数据?函数定义
/*ФУНКЦИЯ ЗАПОЛНЯЕТ КОЛЛЕКЦИЮ ДАННЫМИ ИЗ ТАБЛИЦЫ*/
Future<void> _funGetData() async {
var list = await _database.rawQuery('SELECT * FROM Person');
//заполняем коллекцию объектами
_ara = List<Person>.from( list.map((e) => Person.fromMap(e)) );
}
函数调用
//ГДЕ НУЖНО РАЗМЕСТИТЬ ЭТУ ФУНКЦИЮ ???
_funGetData();
在我的示例中,该函数位于数据库创建或初始化之后,检查之后。我应该在哪里正确放置???
if(_database.isOpen) {
_funTableCreate(_tablePerson);
//ГДЕ НУЖНО РАЗМЕСТИТЬ ЭТУ ФУНКЦИЮ ???
_funGetData();
}
在第一个选项中,当您非常快地启动应用程序时,会出现一个红色错误窗口。
import 'package:flutter/material.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'package:ext_storage/ext_storage.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Name App',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text('Name Page'),
),
body: MyHomePage(),
),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String _str1 = '';
String _str2 = '';
Database _database;
String _databasesPath = '';
String _databaseName = '';
String _tablePerson = '''
CREATE TABLE Person(
id INTEGER NOT NULL,
name TEXT NOT NULL,
age INTEGER NOT NULL
)
''';
List<Person> _ara = [];
@override
void initState() {
super.initState();
_funDatabaseInit();
}
Future<void> _funDatabaseInit() async {
//путь к расположению базы данных
_databasesPath = await ExtStorage.getExternalStoragePublicDirectory(ExtStorage.DIRECTORY_DOWNLOADS);
//имя базы данных
_databaseName = 'abc.db';
//соединение пути и имени
String pathAll = join(_databasesPath, _databaseName);
//создание или открытие базы
_database = await openDatabase(pathAll);
if(_database.isOpen) {
_funTableCreate(_tablePerson);
//ГДЕ НУЖНО РАЗМЕСТИТЬ ЭТУ ФУНКЦИЮ ???
_funGetData();
}
setState(() {
_str1 = '';
_str2 = '';
_str1 = '${_database.isOpen}';
_str2 = _database.path;
});
}
/**/
Future<void> _funTableCreate(String table) async {
await _database.execute(table);
}
/**/
Future<void> _funTableInsert(String table, dynamic classModel) async {
await _database.insert(
table,
classModel.toMap(),
conflictAlgorithm: ConflictAlgorithm.replace
);
}
/*ФУНКЦИЯ ЗАПОЛНЯЕТ КОЛЛЕКЦИЮ ДАННЫМИ ИЗ ТАБЛИЦЫ*/
Future<void> _funGetData() async {
var list = await _database.rawQuery('SELECT * FROM Person');
//заполняем коллекцию объектами
_ara = List<Person>.from( list.map((e) => Person.fromMap(e)) );
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
OutlineButton(
onPressed: () {
setState(() {
_funTableInsert(
'Person',
Person(id: 1, name: 'Ivan', age: 21)
);
});
},
child: Text(
'Insert',
style: TextStyle(
fontSize: 20.0,
color: Colors.deepPurple
),
),
),
],
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [
Text(
'database is open : $_str1'
),
],
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [
Text(
'path : $_str2'
),
],
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [
Text(
'${_ara[0].id} ${_ara[0].name} ${_ara[0].age} ',
),
],
),
),
],
);
}
}
class Person {
//название столбцов таблицы должно совпадать с названием полей
final int id;
final String name;
final int age;
Person({
this.id,
this.name,
this.age
});
//для вставки данных в таблицу
Map<String, dynamic> toMap() {
return {
'id': id,
'name': name,
'age': age,
};
}
//для чтения данных из таблицы
factory Person.fromMap(Map<String, dynamic> map) => Person(
id: map['id'] as int,
name: map['name'] as String,
age: map['age'] as int
);
}
在第二个变体中,任务稍微复杂一些。创建了一个小部件,条件是如果集合的长度为 0,则铭文 Hello World!,如果不等于0,则显示表格数据。Hello World 出现了一会儿!,也就是说,由于某种原因,数据尚未加载到集合中。
函数应该放在哪里?下面是第二版
main.dart的完整代码
import 'package:flutter/material.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'package:ext_storage/ext_storage.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Name App',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text('Name Page'),
),
body: MyHomePage(),
),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String _str1 = '';
String _str2 = '';
Database _database;
String _databasesPath = '';
String _databaseName = '';
String _tablePerson = '''
CREATE TABLE Person(
id INTEGER NOT NULL,
name TEXT NOT NULL,
age INTEGER NOT NULL
)
''';
List<Person> _ara = [];
@override
void initState() {
super.initState();
_funDatabaseInit();
}
Future<void> _funDatabaseInit() async {
//путь к расположению базы данных
_databasesPath = await ExtStorage.getExternalStoragePublicDirectory(ExtStorage.DIRECTORY_DOWNLOADS);
//имя базы данных
_databaseName = 'abc.db';
//соединение пути и имени
String pathAll = join(_databasesPath, _databaseName);
//создание или открытие базы
_database = await openDatabase(pathAll);
if(_database.isOpen) {
_funTableCreate(_tablePerson);
//ГДЕ НУЖНО РАЗМЕСТИТЬ ЭТУ ФУНКЦИЮ ???
_funGetData();
}
setState(() {
_str1 = '';
_str2 = '';
_str1 = '${_database.isOpen}';
_str2 = _database.path;
});
}
/**/
Future<void> _funTableCreate(String table) async {
await _database.execute(table);
}
/**/
Future<void> _funTableInsert(String table, dynamic classModel) async {
await _database.insert(
table,
classModel.toMap(),
conflictAlgorithm: ConflictAlgorithm.replace
);
}
/*ФУНКЦИЯ ЗАПОЛНЯЕТ КОЛЛЕКЦИЮ ДАННЫМИ ИЗ ТАБЛИЦЫ*/
Future<void> _funGetData() async {
var list = await _database.rawQuery('SELECT * FROM Person');
//заполняем коллекцию объектами
_ara = List<Person>.from( list.map((e) => Person.fromMap(e)) );
}
Widget _widgetW() {
if(_ara.length == 0) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [
Text(
'Hello World!',
style: TextStyle(
fontSize: 24.0,
color: Colors.pink,
),
)
],
),
);
} else {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [
ListView.builder(
itemCount: _ara.length,
itemBuilder: (context, index) {
return Text(
'${_ara[index].id} ${_ara[index].name} ${_ara[index].age} ',
);
},
),
],
),
);
}
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
OutlineButton(
onPressed: () {
setState(() {
_funTableInsert(
'Person',
Person(id: 1, name: 'Ivan', age: 21)
);
});
},
child: Text(
'Insert',
style: TextStyle(
fontSize: 20.0,
color: Colors.deepPurple
),
),
),
],
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [
Text(
'database is open : $_str1'
),
],
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [
Text(
'path : $_str2'
),
],
),
),
_widgetW(),
],
);
}
}
class Person {
//название столбцов таблицы должно совпадать с названием полей
final int id;
final String name;
final int age;
Person({
this.id,
this.name,
this.age
});
//для вставки данных в таблицу
Map<String, dynamic> toMap() {
return {
'id': id,
'name': name,
'age': age,
};
}
//для чтения данных из таблицы
factory Person.fromMap(Map<String, dynamic> map) => Person(
id: map['id'] as int,
name: map['name'] as String,
age: map['age'] as int
);
}





尝试这样做:
如果没有关键字
await,则可能在_funGetData();方法创建表之前调用它_funTableCreate(_tablePerson);,这将导致错误。build()还可以通过更改将数据插入数据库的按钮并添加加载指示器来更正:调整
_funTableInsert()以便在插入数据后始终更新屏幕状态:将加载指示符添加到方法中
_funDatabaseInit():并在屏幕上创建一个变量
bool _screenLoading;。