在系统开始时,我需要加载xml文件。
我使用async
/ await
等待rootBundle.loadString
完成。
但是,在这种情况下,print ("I can wait rootBundle here");
在rootBundle.loadString
完成之后执行,runApp(MyApp())
在完成之前启动。
runApp()
完成后是否可以执行rootBundle.loadString
因为我的整个设置都写在一个xml文件中。所以我想确保在首次构建之前先加载。
void main(){
inter = new Internationalize();
inter.init();
runApp(MyApp());
}
class Internationalize{
var intls = {};
var xmlBody;
void init(){
print("internationalize class start");
rootBundle.loadString('assets/i18n/en/strings.xml').then(
(String contents) {
var document = xml.parse(contents);
xmlBody = document.findAllElements('string');
print("load finish");
});
print ("I can wait rootBundle here");
}
}
答案 0 :(得分:0)
void main() async { // mark it async
WidgetsFlutterBinding.ensureInitialized(); // mandatory since Flutter 1.9 if you're making this method async
inter = new Internationalize();
await inter.init(); // await here
runApp(MyApp());
}
class Internationalize {
var intls = {};
var xmlBody;
Future<void> init() async { // make it Future<void>
print("internationalize class start");
String contents = await rootBundle.loadString('assets/i18n/en/strings.xml'); // await on loadString
var document = xml.parse(contents);
xmlBody = document.findAllElements('string');
print("load finish");
print("I can wait rootBundle here");
}
}
答案 1 :(得分:0)
这与@CopsOnRoad给出的答案相同,并带有一些解释。
您应该分开使用将来的响应rootBundle.loadString()
。
尝试以下操作:
String contents = await rootBundle.loadString('assets/i18n/en/strings.xml');
var document = xml.parse(contents);
xmlBody = document.findAllElements('string');
print("load finish");
注意:您需要在所有方法中添加async
修饰符,甚至在主方法中也要添加await
,并在每次方法调用之前添加void main(){
...
await inter.init();
...
}
...
Future<void> init async {
String contents = await rootBundle.loadString('assets/i18n/en/strings.xml');
var document = xml.parse(contents);
xmlBody = document.findAllElements('string');
print("load finish");
}
。
即:
=CountRows("DataSet1")