从flutter应用程序中的sqlite数据库获取数据时,Snapshot.data始终返回null

时间:2020-01-04 07:22:01

标签: android flutter dart android-sqlite sqflite

尽管数据库中有数据,但这种情况一直在发生。我是新手,我已经将近三天的时间来解决此问题。 snapshot.data 返回null,我不知道为什么,因为数据库中有足够的数据。

下面是 db_helper.dart 文件。

import 'dart:async';
import 'dart:io' as io;
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
import 'package:com.example.simple_app/models/person.dart';
import 'package:path/path.dart';

class DBHelper {
  static Database db_instance;

  Future<Database> get db async {
    if (db_instance == null) {
      db_instance = await initDB();
    }
    return db_instance;
  }

  initDB() async {
    var databasesPath = await getDatabasesPath();
    String path = join(databasesPath, 'simpleapp.db');
    var db = await openDatabase(path, version: 1, onCreate: onCreateFunc);
    return db;
  }

  void onCreateFunc(Database db, int version) async {
    // create table
    await db.execute(
        'CREATE TABLE persons(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, created DATETIME, updated DATETIME);');
  }

   /// crud functions

  Future<List<Person>> getAllPersons() async {
    final db_connection = await db;
    var response = await db_connection.query("Person");
    List<Person> list = response.map((c) => Person.fromMap(c)).toList();
    return list;
  }

  // add new person
  void addNewPerson(Person person) async {
    var db_connection = await db;
    String query = """
        INSERT INTO persons(name,created,updated) VALUES('${person.name}','${person.created}', '${person.updated}')
        """;
    await db_connection.transaction((transaction) async {
      print(query);
      return await transaction.rawInsert(query);
    });
  }
}

下面是 home.dart 文件,我试图在其中显示FutereBuilder中数据库中的数据,但快照始终返回null,这导致加载程序圈圈了所有内容时间。

import 'package:com.example.simple_app/models/person.dart';
import 'package:com.example.simple_app/utils/db_helper.dart';
import 'package:flutter/material.dart';
import 'package:com.example.simple_app/common_widgets/appbar.dart';
import 'dart:async';
import 'package:sqflite/sqflite.dart';

var dbHelper = DBHelper();

class HomePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _HomePageState();
  }
}


class _HomePageState extends State<HomePage> {
  int _currentIndex = 0;
  final List<Widget> _children = [];
  static const TextStyle moneyLendingAction =
      TextStyle(color: Colors.white, fontSize: 20);

  @override
  Widget build(BuildContext context) {
    final controller_name = new TextEditingController();

    return new Scaffold(
      appBar: appbar(context, 'Simple App', 'other data'),
      body: new Container(
        padding: EdgeInsets.all(16.0),
        child: FutureBuilder<List<Person>>(
          future: dbHelper.getAllPersons(),
          builder:
              (BuildContext context, AsyncSnapshot<List<Person>> snapshot) {
            if (snapshot.hasData) {
              return ListView.builder(
                physics: BouncingScrollPhysics(),
                itemCount: snapshot.data.length,
                itemBuilder: (BuildContext context, int index) {
                  Person item = snapshot.data[index];
                  return Dismissible(
                    background: Container(color: Colors.red),
                    onDismissed: (direction) {},
                    child: ListTile(
                      title: Text(item.name),
                      subtitle: Text(item.name),
                      leading: CircleAvatar(child: Text(item.id.toString())),
                    ),
                  );
                },
              );
            } else {
              // because snapshot.data is returning null, this is showing all time.
              return Center(child: CircularProgressIndicator()); 
            }
          },
        ),
      ),
    );
  }

  @override
  void initState() {
    super.initState();
  }
}

下面是 person.dart 模型文件。

class Person {
  int id;
  String name;
  DateTime created, updated;

  Person({this.id, this.name, this.created, this.updated});

  factory Person.fromMap(Map<String, dynamic> json) => new Person(
        id: json["id"],
        name: json["name"],
        created: json["created"],
        updated: json["updated"],
      );

  Map<String, dynamic> toMap() => {
        "id": id,
        "name": name,
        "created": created,
        "updated": updated,
      };
}

我要显示的是FutureBuilder中来自数据库的数据。并且请不要告诉我这是重复的,因为我已经检查了类似的问题,并且没有看到与我的代码中发生的事情有关的任何问题。 谢谢你,满怀爱意。

1 个答案:

答案 0 :(得分:0)

您需要从JSON响应中转换日期字符串

created: DateTime.parse(data['created_at'].toString()), updated: DateTime.parse(data['date'].toString()),