【问题标题】:How to get values from Future<List> in Flutter如何从 Flutter 中的 Future<List> 获取值
【发布时间】:2020-06-21 11:21:39
【问题描述】:

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

【问题讨论】:

  • 不是bug Instance of Task 表示List 包含Task 对象。

标签: flutter sqflite


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    当我使用 print(await tasks()) 时,它显示 [Instance of 'Task', Instance '任务'] 在控制台中。是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!
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 2022-10-24
      • 2019-07-01
      • 2022-01-14
      • 1970-01-01
      • 2022-01-03
      • 2021-01-30
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多