如何在 Flutter 中从 Future<List> 获取值

How to get values from Future<List> in Flutter

我想从 sqflite 数据库中获取值到 flutter 中的列表。 这是我的模型 class


class Task {
  final int id;
  final String title;
  final String description;
  final String dateTime;

  Task({this.id, this.title, this.description, this.dateTime});

  
  Map<String, dynamic> toMap() {
    return {
      'id':id,
      'title': title,
      'description': description,
      'dateTime': dateTime,
    };
  }

这是用于插入和检索数据的数据库助手class。


class DatabaseHelper {
  DatabaseHelper._();
  static final DatabaseHelper db = DatabaseHelper._();

  Database _database;

  Future<Database> get database async {
    if (_database != null) return _database;
    _database = await _createDatabase();
    return _database;
  }

  Future<Database> _createDatabase() async {
    return await openDatabase(join(await getDatabasesPath(), 'task.db'),
        onCreate: (db, version) {
      return db.execute(
        "CREATE TABLE tasks(id INTEGER PRIMARY KEY AUTO_INCREMENT , title TEXT, description TEXT, dateTime TEXT)",
      );
    }, version: 1);
  }


Future<List<Task>> tasks() async {
 
  final Database db = await database;

  final maps = await db.query('tasks');

  return List.generate(maps.length, (i) {
    return Task(
      id: maps[i]['id'],
      title: maps[i]['title'],
      description: maps[i]['description'],
      dateTime: maps[i]['dateTime']
    );
  });
}



Future<void> insertTask(Task task) async {
  final db = await database;


  await db.insert(
    'tasks',
    task.toMap(),
    conflictAlgorithm: ConflictAlgorithm.replace,
  );
}
}

当我使用 print(await tasks()) 时,它在控制台中显示 [[=19= 的实例],'Task' 的实例]。这是一个错误吗?我想知道如何使用 DatabaseHelper class.

中的 task() 函数从数据库中获取值

使用 future 构建器,它需要 future 并且会在 future 的对象发生变化时构建。

When I use print(await tasks()) it shows [Instance of 'Task', Instance of 'Task'] in console. is it a bug?

发生这种情况是因为您没有覆盖 toString()。没有 toString() 你只会得到默认的字符串转换 "XXX 的实例":

class Example {}

void main() async {
  print(Example());  // Instance of 'Example'
}

通过覆盖 toString() 您可以自定义输出:

class Example {
  @override
  String toString() => "My custom Example!";
}

void main() async {
  print(Task());  // My custom Example!
}

I want to know how to get values form database using task()

Flutter 中等待 Future<T> 的最常见方法是使用 FutureBuilder<T> 小部件。这非常方便,因为它可以显示一个进度指示器(让用户知道后台正在发生某些事情),稍后将由实际数据替换