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

时间:2020-06-21 11:21:39

标签: flutter sqflite

我想从sqflite数据库中获取价值,快速获得清单。 这是我的模特班


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,
    };
  }

这是用于插入和检索数据的databaseHelper类。


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 task())时,它在控制台中显示[Task的实例,Task的实例]。这是一个错误吗?我想知道如何使用DatabaseHelper类中的task()函数从数据库获取值。

2 个答案:

答案 0 :(得分:1)

使用将来的构建器,它需要将来并且将在将来的对象发生更改时进行构建。

答案 1 :(得分:1)

当我使用print(await task())时,它显示['Task'的实例,实例 控制台中的“任务”]。是虫子吗?

发生这种情况是因为您没有覆盖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!
}

我想知道如何使用task()从数据库获取值

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