Невозможно отобразить текст из базы данных в текстовом виджете в Flutter

#sql #flutter #dart #gridview #sqflite

#sql #flutter #dart #gridview #sqflite

Вопрос:

Кодирую в dart уже несколько месяцев. В настоящее время пытаюсь создать представление таблицы, содержащее заголовки из локальной базы данных SQL. Я могу просмотреть базу данных и сохранить заголовки в массив для последующего использования. Я могу распечатать их без проблем, но когда я пытаюсь отобразить их в моем представлении сетки, я получаю «тип ‘Future’ не является подтипом типа ‘String'» Странно, что мой код работал секунду и отображал информацию правильно, но как только я обновил страницу(Я не трогал код) Я получил ошибку, которая меня больше всего смущает.

Вспомогательный класс базы данных

 getFactTitle(String target, int position) async {
    Database db = await this.database;
    String searchString =
        ('SELECT title FROM factTable WHERE fid="'   target   '"');
    var result = await db.rawQuery(searchString);
    if (result.length > 0) {
      titles[position] = result.first.values.first.toString();
    } else {
      return null;
    }
    
  }
  

Вид сетки

 Widget _buttons() {
    return Expanded(
      child: GridView.count(
        crossAxisCount: 2, //NUMBER OF COLUMNS
        children: List.generate(numberOfFacts, (index) {
          return Center(
            child: new Column(children: <Widget>[
              IconButton(
                  icon: Image.asset('assets/pictures/'  
                      category  
                      _stringIndex(index)  
                      'a.jpg'),
                  onPressed: () {
                    print("Clicked: "   category   _stringIndex(index));
                  }),
              Text(
                _getTitle(index),
              ),
            ]),
          );
        }),
      ),
    );
  }

  _getTitle(int index) async {
    print(titles[index]);
    return titles[index];
  }

  _getTitles() async {
    String theTitle;
    _getCategory();
    for (int i = 1; i <= numberOfFacts; i  ) {
      String target = category   (i.toString());
      await helper.getFactTitle(target, i);
      print(titles[i]);
      theTitle = titles[i];
    }
    return theTitle;
  }
  

Ответ №1:

Поскольку _getTitle(int index) async вам придется подождать его завершения. В этом случае вы можете использовать FutureBuilder .

 FutureBuilder<String>(
      future: _getTitle(index),
      builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
        if (snapshot.hasData) {
            return Text(snapshot.data);
        }
     }
);
  

вы также можете обрабатывать ошибки и состояние ожидания.

Дополнительная информация: https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html

Комментарии:

1. Спасибо! Я понял!

Ответ №2:

_getTitle(int index) не должно быть async .