尽管数据库中有数据,但这种情况一直在发生。我是新手,我已经将近三天的时间来解决此问题。 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
中来自数据库的数据。并且请不要告诉我这是重复的,因为我已经检查了类似的问题,并且没有看到与我的代码中发生的事情有关的任何问题。
谢谢你,满怀爱意。
答案 0 :(得分:0)
您需要从JSON响应中转换日期字符串
created: DateTime.parse(data['created_at'].toString()),
updated: DateTime.parse(data['date'].toString()),