【问题标题】:How to avoid a "null" error when the List returned to ListView builder is empty?当返回给 ListView 构建器的 List 为空时,如何避免“null”错误?
【发布时间】:2020-09-16 06:52:51
【问题描述】:
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: 方法 '[]' 在 null 上被调用。”

谁能详细说明在函数“handValue”和“HandleError”中写什么,这样我就可以避免在 DB 表没有记录时首次启动 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(),
                );
              },
            ),
          ),

【问题讨论】:

  • 分享您的ListView 代码。

标签: listview flutter exception dart


【解决方案1】:

访问getAssets() 方法时使用?.。此 null 感知运算符将阻止您的异常。

用法示例: Future&lt;List&lt;Asset&gt;&gt; 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;
}

【讨论】:

  • 添加 ?.让它工作。正确的代码...```Future> assets = dbHelper?.getAssets();````
  • @FlutterDev008 正如我的回答所说,使用await 会产生更清晰的代码。
  • 是的,我将它与您指定的 try、catch 方法一起使用,并且代码不再抛出异常。是的,需要等待。
猜你喜欢
  • 2021-05-22
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多