Будущее <List>для списка с объектами во флаттере - PullRequest
0 голосов
/ 03 августа 2020

Недавно я начал с Flutter. В моем приложении работает база данных sqflite, и я хочу получить из нее все данные и показать их в виде виджета строки в моем приложении.

Я знаю, как получать данные, и я знаю, как создавать виджеты. Я так запутался, я понятия не имею, как преобразовать данные, которые я получаю из базы данных, в список (с этим я мог бы создавать свои виджеты).

Итак, я получаю Future List, но мне нужен List Drink

Просто посмотрите:

Мой объект:

class Drink {
  int id;
  String time;
  int amount;

  Drink({this.id, this.time, this.amount});
}

База данных:

Future _onCreate(Database db, int version) async {
    await db.execute('''
          CREATE TABLE $table (
            $columnId INTEGER PRIMARY KEY,
            $columnTime TEXT NOT NULL,
            $columnAmount INTEGER NOT NULL
          )
          ''');
  }

Как я получаю результат:

Future<List> raw() async {
    Database db = await instance.database;
    var dbClient = await db;
    var result = await dbClient.rawQuery("SELECT * FROM $table");
    List<Map<String, dynamic>> r = result.toList();
    return r;
  }

1 Ответ

1 голос
/ 03 августа 2020

Создайте конструктор фабрики в вашем model

class Drink {
  int id;
  String time;
  int amount;

  Drink({this.id, this.time, this.amount});

  factory Drink.fromJson(Map<String, dynamic> json) {
        return Drink(
            id: json['columnId'],
            time: json['columnTime'], 
            amount: json['columnAmount'], 
        );
    }
}

Позже вы можете сопоставить полученные данные db с Drink следующим образом

Future<List<Drink>> fetchDrinks() async {
    Database db = await instance.database;
    var dbClient = await db;
    var result = await dbClient.rawQuery("SELECT * FROM $table");
    List<Map<String, dynamic>> r = result.toList().map((data) => Drink.fromJson(data));
    return r;
  }

Вы можете использовать await метод fetchDrinks, чтобы получить список объектов Drink.

Я не тестировал это.

...