Dart FileUpdater 仅适用于一个字段

Dart FileUpdater works only on one field

我有这段代码应该更新 .plist 文件

Future<String> getJsonAsString() async{
  var config = File('my_file.json');
  var stringContents = await config.readAsString();
  return stringContents;
}

Future<void> updateFields() async {
  var data = jsonDecode(await getJsonAsString());
  FileUpdater.updateFile(
    File('file.plist'),
    Plist(
      'field1',
      data['field1'],
    ),
  );
  FileUpdater.updateFile(
    File('file.plist'),
    Plist(
      'field2',
      data['field2'],
    ),
  );
}

my_file.json 是一个非常简单的 json 文件,没有嵌套数据,像这样:

{"field1": "value1", "field2": "value2"}

file.plist的结构如下:

...
        <key>field1</key>
        <string>some_value1</string>
        <key>field2</key>
        <string>some_value2</string>
...

当我运行我的代码时,我得到的是只有some_value2被改变并变成了value2,而 filed1 还有 some_value1,像这样:

...
        <key>field1</key>
        <string>some_value1</string>
        <key>field2</key>
        <string>value2</string>
...

如果我删除第二个 FileUpdater,field1 会正确更新。 我的代码中有什么我看不到的错误吗?

它没有按预期工作,因为 updateFile() 方法是 async method.

在你的代码中,你在调用这个方法时没有使用 await 关键字,所以基本上你要求它在第一次更新开始之前执行第二次更新,在这种情况下(我不知道它们的确切实现),它可能会丢弃第一个请求。

如果使用 await 关键字:

Future<void> updateFields() async {
  var data = jsonDecode(await getJsonAsString());
  await FileUpdater.updateFile(
    File('file.plist'),
    Plist(
      'field1',
      data['field1'],
    ),
  );
  await FileUpdater.updateFile(
    File('file.plist'),
    Plist(
      'field2',
      data['field2'],
    ),
  );
}

那么它应该可以工作了,因为编辑将完成 one-at-a-time。

注意:仅仅因为方法是异步的并不意味着您必须始终使用 await —— 在这种情况下,只有在第一次调用时才绝对需要 await 关键字(因为会有后续调用),所以在 second/last 调用中使用它并不是绝对必要的...但我更改了两者,因为它可能 better/safer 总是使用它。