2017-06-06 59 views

回答

4

当您build方法需要等待Future,它打破了FutureBuilder的好时机。

void main() { 
    runApp(new FutureBuilder(
    future: SharedPreferences.getInstance(), 
    builder: (_, snapshot) { 
     return snapshot.hasData ? 
      new MyApp(preferences: snapshot.data) : 
      new LoadingScreen(); 
    }, 
)); 
} 

建立这种模式的应用程序的一些技巧:

  • SharedPreferences.getInstance()是相当快的。您的应用可能会看起来更好,将空的Container作为黑色加载屏幕,而不是闪烁的彩色内容。但是,如果您同时加载其他内容,则显示您的徽标更有意义。

  • 如果您需要等待多个期货,您可以使用 Future.wait或嵌套多个FutureBuilder s在一起。

2

一种方法是延迟加载屏幕显示您的主应用程序。我见过一个模式是:

main() async { 
    runApp(new LoadingScreen()); 
    runApp(new App(await asyncStuff())); 
} 

您可以经常为你喜欢叫runApp:https://docs.flutter.io/flutter/widgets/runApp.html

0

你也可以使用一个StatefulWidgetsetState应用程序配置完成后更新根部件。调用的setState前

mainWidget = loadingWidget(); 
someMethodThatDoesAppConfig().then((Widget configuredWidget) { 
    setState(() { 
     _mainWidget = configuredWidget; 
    }); 
}); 
+2

当您在异步回调的时候,你应该检查(装):

您可以使用类似(简称):

@override Widget build(BuildContext context) { _return mainWidget; } 

在结合以确保您的小部件尚未被处置。否则,Flutter会断言。 FutureBuilder自动为你做这件事。在这种特殊情况下,它可能没有问题,因为StatefulWidget接近应用程序的根目录,不太可能被卸载,但在构建可组合的小部件时,这是一个很好的习惯。 –