2017-06-06 70 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接近應用程序的根目錄,不太可能被卸載,但在構建可組合的小部件時,這是一個很好的習慣。 –