данные не выводятся на экран

Данные не выводятся на экран. База создана. Данные вставлены. Далее полный код и скриншоты.

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
 );

}


База создана
База создана


Данные вставлены
Данные вставлены


Ошибка
введите сюда описание изображения


Ответы (0 шт):