данные не выводятся на экран
Данные не выводятся на экран. База создана. Данные вставлены. Далее полный код и скриншоты.
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> {
Future<List<Person>> _future;
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
)
''';
@override
void initState() {
super.initState();
_funDatabaseInit();
_future = _funGetData();
}
@override
void dispose() {
super.dispose();
}
void _f1() {
setState(() {
});
}
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);
}
setState(() {
_str1 = '';
_str2 = '';
_str1 = '${_database.isOpen}';
_str2 = _database.path;
});
}
Future<void> _funCheck() async {
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<List<Person>> _funGetData() async {
var ara = await _database.rawQuery('SELECT * FROM Person');
//объект
return List<Person>.from( ara.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: Wrap(
direction: Axis.horizontal,
children: [
FutureBuilder<List<Person>>(
future: _future,
builder: (context, snapshot) {
if(snapshot.hasData) {
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (context, index) => Text(
'${snapshot.data[index].id} ${snapshot.data[index].name} ${snapshot.data[index].age}'
),
);
}
else if(snapshot.hasError) {
return Text(
'${snapshot.error}'
);
}
else {
return SizedBox(
width: 0.0,
height: 0.0,
);
}
},
),
],
),
),
],
);
}
}
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
);
}


