尝试在Flutter应用中从sqlite数据库获取数据时遇到错误

时间:2020-01-03 15:46:24

标签: android flutter dart android-sqlite sqflite

我正在尝试使用sqflite从sqlite数据库中获取数据并将其插入list_view中。一切似乎都很好,但是当我向数据库中添加某些内容并尝试获取数据并将其放在 home.dart 文件中的列表视图中时,我总是收到错误消息。

下面是 home.dart 文件。这是我试图从数据库中获取数据并创建列表视图的地方。 此文件上发生错误。

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 'package:com.example.simple_app/common_widgets/drawer.dart';
import 'dart:async';
import 'package:sqflite/sqflite.dart';

Future<List<Person>> getPersonsFromDB() async {
  var dbHelper = DBHelper();
  Future<List<Person>> persons = dbHelper.getPersons();
  return persons;
}

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);
  final controller_name = new TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: appbar(context, 'Simple App', 'other data'),
      body: new Container(
        padding: EdgeInsets.all(16.0),
        child: FutureBuilder<List<Person>>(
            future: getPersonsFromDB(),
            builder: (context, snapshot) {
                print(snapshot.data);

              if (snapshot.data != null) {
                if (snapshot.hasData) {
                  return ListView.builder(
                      itemCount: snapshot.data.length,
                      itemBuilder: (context, index) {
                        return new Row(
                          children: <Widget>[
                            Expanded(
                              child: Column(
                                crossAxisAlignment: CrossAxisAlignment.start,
                                children: <Widget>[
                                  Container(
                                    padding: const EdgeInsets.only(
                                      bottom: 8.0,
                                    ),
                                    child: Text(
                                      snapshot.data[index].name,
                                      style: TextStyle(
                                        fontWeight: FontWeight.bold,
                                      ),
                                    ),
                                  ),
                                ],
                              ),
                            ),
                          ],
                        );
                      });
                }
              }
              // show loading
              // return new Container(
              //   alignment: AlignmentDirectional.center,
              //   child: new CircularProgressIndicator(),
              // );
            }),
      ),
    );
  }
    setState(() {
      _currentIndex = index;
    });
  }
}

下面是 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, 'demo2.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 person(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, created DATETIME, updated DATETIME);');
  }

  /**
   * crud functions
   */

  Future<List<Person>> getPersons() async {
    var db_connection = await db;
    List<Map> list = await db_connection.rawQuery('SELECT * FROM person');
    List<Person> persons = new List();
    for (int i = 0; i < list.length; i++) {
      Person person = new Person();
      person.id = list[i]['id'];
      person.name = list[i]['name'];
      person.created = list[i]['created'];
      person.updated = list[i]['updated'];

      persons.add(person);
    }
    return persons;
  }

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

  // update person
  void updatePerson(Person person) async {
    var db_connection = await db;
    String query = """
        UPDATE person SET name='${person.name}',created='${person.created}',updated='${person.updated}' WHERE id=${person.id}
        """;
    await db_connection.transaction((transaction) async {
      return await transaction.rawQuery(query);
    });
  }

  // delete person
  void deletePerson(Person person) async {
    var db_connection = await db;
    String query = """
        DELETE FROM person WHERE id=${person.id}
        """;
    await db_connection.transaction((transaction) async {
      return await transaction.rawQuery(query);
    });
  }
}

下面是我进入调试控制台的错误日志

I/flutter (12326): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (12326): The following assertion was thrown building FutureBuilder<List<Person>>(dirty, state:
I/flutter (12326): _FutureBuilderState<List<Person>>#caa58):
I/flutter (12326): A build function returned null.
I/flutter (12326): The offending widget is:
I/flutter (12326):   FutureBuilder<List<Person>>
I/flutter (12326): Build functions must never return null.
I/flutter (12326): To return an empty space that causes the building widget to fill available room, return
I/flutter (12326): "Container()". To return an empty space that takes as little room as possible, return
// and the logs go on and on below...

我不了解的东西似乎还不错,但是当我尝试从sqlite数据库中获取数据并在首页文件中列出数据时,我总是遇到错误。这可能是一个简单的问题,但是由于我是新手,所以我无法弄清楚。

我想要的是能够从数据库中获取数据并将其放在首页中的列表视图中,而不会出现任何错误。谢谢你,满怀爱意。

1 个答案:

答案 0 :(得分:0)

如上所述,Build functions must never return null。只需取消注释您已注释的代码,这些代码将在将来完成之前调用:

// show loading
return new Container(
  alignment: AlignmentDirectional.center,
  child: new CircularProgressIndicator(),
);