Преобразовать будущее <List <String>> в List <String>при вызове функции Sqflite - PullRequest
0 голосов
/ 10 июля 2019

Я хочу получить все элементы из базы данных, но я застрял, как преобразовать будущий список строк в список строк.

var x =  DataBaseHelper.instance.queryAllRows();


 Future<List<String>> queryAllRows() async {
    Database db = await instance._initDatabase();
    List<Map<String,dynamic>> s =  await db.query(table ,columns: [columnname]);
    List<String> list = new List();
    for(var x in s){
      x.forEach((k,v)=>list.add(v));
    }
    return list;
 }

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

Ответы [ 4 ]

1 голос
/ 10 июля 2019

Вам нужна асинхронная функция для извлечения данных.

void yourFunction() async {
     var x =  await DataBaseHelper.instance.queryAllRows();

}
0 голосов
/ 10 июля 2019

Вам нужно дождаться выполнения queryAllRows ().Если вы находитесь в контексте функции, которая может быть помечена как асинхронная, просто нужно использовать ключевое слово:

void someFunction() async {
var x =  await DataBaseHelper.instance.queryAllRows(); // x is List<String>
}

Вместо этого, если вы хотите отобразить список, вы можете использовать FutureBuilder и управлять виджетом визуализации.в зависимости от будущего состояния:

Widget test(BuildContext context) {
  return FutureBuilder<List<String>>(
    future: DataBaseHelper.instance.queryAllRows(),
    builder: (context, snap) {
      if (snap.hasData && !snap.hasError) {
        return ListView(
          padding: const EdgeInsets.all(8.0),
          children: <Widget>[...snap.data],
        );
      }
      else {
        return Container();
      }
    },
  );
}
0 голосов
/ 10 июля 2019

У вас есть два варианта. Вы можете использовать будущий строитель для создания виджетов или использовать простые фьючерсы + setState

https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html

https://dart.dev/tutorials/language/futures

https://api.flutter.dev/flutter/widgets/State/setState.html

List<String> _databaseList

queryAllRows().then((rows) {

   setState(() {_databaseList = rows});
})

setState скажет виджету перестроить дерево виджетов. then для обработки будущего.

0 голосов
/ 10 июля 2019

Поскольку db.querys асинхронны, они будут возвращать Future<List<Map<String,dynamic>>.Чтобы получить их результат без будущего, мы можем перезвонить, и вместо этого он вернет List<Map<String,dynamic>>.

var x =  DataBaseHelper.instance.queryAllRows();

  Future<List<String>> queryAllRows() async {
    Database db = await instance._initDatabase();
    db.query(table ,columns: [columnname]).then((data){
      List<Map<String,dynamic>> s = data;
      List<String> list = new List();
      for(var x in s){
        x.forEach((k,v)=>list.add(v));
      }
    });
    return list;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...