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 总是使用它。
我有这段代码应该更新 .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 总是使用它。