【问题标题】:Flutter - Fetch records from database and display in ListView BuilderFlutter - 从数据库中获取记录并在 ListView Builder 中显示
【发布时间】:2019-05-07 03:11:25
【问题描述】:

我正在开发一个 Flutter 项目并使用 Sqflite 数据库。我已经设法将数据保存在数据库中。现在我正在尝试根据表名从数据库中获取所有记录的列表并将它们显示在“ListView.builder”中。

database_helper.dart

Future<List> getAllRecords(String dbTable) async {
    var dbClient = await db;
    var result = await dbClient.rawQuery("SELECT * FROM $dbTable");

    return result.toList();
}

employees_list.dart

import 'package:flutter/material.dart';
import 'package:flutter_with_db_single_helper/helpers/database_helper.dart';

var db = new DatabaseHelper();
Future<List> _users = db.getAllRecords("tabEmployee"); // CALLS FUTURE

class EmployeesListScreen extends StatefulWidget {
  @override
  _EmployeesListScreenState createState() => _EmployeesListScreenState();
}

class _EmployeesListScreenState extends State<EmployeesListScreen> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('List Of Employees'),
      ),
      body: ListView.builder(
        // itemCount: _users.length,
        itemBuilder: (_, int position) {
          return Card(
            child: ListTile(
              title:
                  Text("Employee Name: "), // EMPLOYEE NAME TO BE DISPLAYED HERE
            ),
          );
        },
      ),
    );
  }
}

我哪里做错了?如何在列表中显示我的所有 db 表记录?

【问题讨论】:

  • 错误是什么?

标签: sqlite dart flutter


【解决方案1】:

您可以使用 FutureBuilder 来获取和显示您的数据:

        class _EmployeesListScreenState extends State<EmployeesListScreen> {
          var db = new DatabaseHelper(); // CALLS FUTURE

          @override
          Widget build(BuildContext context) {
            return Scaffold(
              appBar: AppBar(
                title: Text('List Of Employees'),
              ),
              body: FutureBuilder<List>(
                future: db.getAllRecords("tabEmployee"),
                initialData: List(),
                builder: (context, snapshot) {
                  return snapshot.hasData
                      ? ListView.builder(
                          itemCount: snapshot.data.length,
                          itemBuilder: (_, int position) {
                            final item = snapshot.data[position];
                            //get your item data here ...
                            return Card(
                              child: ListTile(
                                title: Text(
                                    "Employee Name: " + snapshot.data[position].row[1]),
                              ),
                            );
                          },
                        )
                      : Center(
                          child: CircularProgressIndicator(),
                        );
                },
              ),
            );
          }
        }

【讨论】:

  • 很好的答案,但是可以稍微简化一下:) "Employee Name: " + item.row[1]
【解决方案2】:

这可能不是正确的代码,因为我没有对此进行测试,但这是列表视图构建器的工作方式并尝试使用异步等待。清理代码相当多!

import 'package:flutter/material.dart';
import 'package:flutter_with_db_single_helper/helpers/database_helper.dart'

class EmployeesListScreen extends StatefulWidget {
    @override
    _EmployeesListScreenState createState() => _EmployeesListScreenState();
}

class _EmployeesListScreenState extends State<EmployeesListScreen> {

    List<String> _records;
    @override
    initState(){
        super.initState();
    }

    Future<void> _getRecords() async {
        var res = await db.getAllRecords("tabEmployee"); 
        setState((){
            _records = res;
        });
    }

    @override
    Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
        title: Text('List Of Employees'),
        ),
        body: _records==null ? Container():ListView.builder(
        itemCount: _records.length,
        itemBuilder: (_, int position) {
            return Card(
            child: ListTile(
                title:
                    Text("Employee Name: ", _records[position]),
            ),
            );
        },
        ),
    );
    }
}

或者您可以使用未来的构建器,如另一个答案所示。 :)

【讨论】:

  • 这是一个很好的方法。感谢您的帮助。不过我用的是 FutureBuilder。
猜你喜欢
  • 2013-12-03
  • 2022-06-13
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
相关资源
最近更新 更多