我有这个功能:

  Future<String> load(SharedPreferences prefs, String fileName) async {
    prefs = await SharedPreferences.getInstance();
    String jsonString = prefs.getString(fileName) ?? "";
    if (jsonString.isNotEmpty) {
      return jsonString;
    }else{
      return ...
    }
  }

在其他情况下我应该退还什么呢?我试着用"",但不起作用.

推荐答案

答案是"视情况而定".也就是说,这取决于您对此函数的结果到底做了什么,以及一个好的空默认值在该上下文中意味着什么.

假设您将返回的JSON字符串转换为Map<String, dynamic>的值为decoding,那么较好的默认值可能是空映射.在这种情况下,您可以按如下方式重新表述您的函数:

Future<String> loadJSON(final String fileName) async {
  final SharedPreferences prefs = await SharedPreferences.getInstance();
  final String jsonString = prefs.getString(fileName);
  if (jsonString != null && jsonString.isNotEmpty) {
    return jsonString;
  }
  return "{}"; // default value
}

final String jsonString = await loadJSON("test.json");

final Map<String, dynamic> jsonData = json.decode(jsonString);

但是,将此过程重新表述为返回实际映射值的稍高级别的函数可能更有意义:

Future<Map<String, dynamic>> loadData(final String fileName) async {
  final SharedPreferences prefs = await SharedPreferences.getInstance();
  final String jsonString = prefs.getString(fileName);
  if (jsonString != null && jsonString.isNotEmpty) {
    return json.decode(jsonString);
  }
  return Map(); // default value
}

final Map<String, dynamic> jsonData = await loadData("test.json");

Dart相关问答推荐

Dart StreamController().stream 等于 == 但不相同

Dart:当两个或多个任务等待同一个 Future 时会发生什么

如何为屏幕设置不同的主题?

禁用 ListView 滚动

VS Code 无法识别 Flutter 中的单元测试

触发从小部件到状态对象的函数

Flutter|Dart 创建匿名类

VSCode Flutter Dart 启动慢的建议

错误:不要从另一个包中导入实现文件

Dart 中使用 ifAbsent 的 Map Update 方法

Flatter有数据绑定吗?

Flutter:并非所有本地化代表都支持应用程序的语言环境

如何在 Flutter 中让 Android 状态栏变亮

如何提取dart/Flutter视频元数据

如何在 Dart 中上传文件?

Dart 交互/访问数据库

Error: The argument type "String?"can't be assigned to the parameter type"String" because "String?"s nullable and "String"isn't

Dart 中 == 和 === 有什么区别?

是否有任何官方计划在 Google App Engine 上支持 Dart?

extends与 implements与 with