完全等待异步/等待功能

时间:2019-12-03 10:30:58

标签: flutter dart

在系统开始时,我需要加载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");
  }
}

2 个答案:

答案 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")