Как избежать "нулевой" ошибки, когда список, возвращаемый построителю ListView, пуст? - PullRequest
0 голосов
/ 28 мая 2020
Future<List<Asset>> fetchAssetsFromDatabase() async {
  var dbHelper = DBHelper();
  Future<List<Asset>> assets = dbHelper.getAssets();
  assets.then((value) => handleValue(value)).catchError((error) => handleError(error));
  return assets;
}

«Актив» имеет 6 строк, определенных в нем. Когда getAssets выполняется без добавленных записей (таблица db пуста), я получаю следующую ошибку.

"E / flutter (23529): [ERROR: flutter / lib / ui / ui_dart_state. cc (157 )] Необработанное исключение: NoSuchMethodError: метод '[]' был вызван при нулевом значении. "

Может ли кто-нибудь уточнить, что писать в функциях handValue и HandleError, чтобы я мог избежать исключения при первом запуске Listview, когда в таблице БД нет записей.

Expanded(
            child: FutureBuilder<List<Asset>>(
              future: fetchAssetsFromDatabase(),
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  return ListView.builder(
                      itemCount: filterAssets.length,
                      itemBuilder: (context, index) {
                        return ListTile(
                          title: Text(filterAssets[index].name),
                          subtitle: Text(filterAssets[index].url),
                          onTap: () {
                            Navigator.push(
                              context,
                              MaterialPageRoute(
                                builder: (context) => View(
                                  assets: Asset(
                                      id: filterAssets[index].id,
                                      name: filterAssets[index].name,
                                      username: filterAssets[index].username,
                                      password: filterAssets[index].password,
                                      url: filterAssets[index].url,
                                      notes: filterAssets[index].notes,
                                      other: filterAssets[index].other),
                                ),
                              ),
                            );
                          },
                        );
                      });
                } else if (snapshot.hasData == false) {
                  return new Text("No Data found", textAlign: TextAlign.center);
                }
                return new Container(
                  alignment: AlignmentDirectional.center,
                  child: new CircularProgressIndicator(),
                );
              },
            ),
          ),

1 Ответ

0 голосов
/ 28 мая 2020

Используйте ?. при доступе к методу getAssets(). Этот нулевой оператор предотвратит ваше исключение.

Пример использования: Future<List<Asset>> assets = dbHelper?.getAssets();

Кроме того, вы можете использовать ключевое слово await вместо текущей сложной обработки Future, что упростит ваш код.

Future<List<Asset>> fetchAssetsFromDatabase() async {
  var dbHelper = DBHelper();
  List<Asset> assets = await dbHelper?.getAssets();
  return assets;
}

И если вы считаете, что это необходимо, вы можете использовать блок try-catch для замены вашего catchError.

Future<List<Asset>> fetchAssetsFromDatabase() async {
  var dbHelper = DBHelper();
  List<Asset> assets;
  try {
    assets = await dbHelper?.getAssets();
  } catch(e) {
    print(e);
  }
  return assets;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...