2017-06-06 24 views
2

Flutter shared_prefsプラグインの非同期性を考えれば、アプリ起動時に正しいテーマ設定がすぐに表示されるようにするにはどうすればよいですか?私。 shared_prefsの読み込みが完了したら、デフォルトテーマのフラッシュはなく、正しいテーマを適用します。Flutterアプリで即座にアプリテーマを表示

答えて

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を一緒にネストすることができます。

2

1つの方法は、ローディング画面でメインアプリの表示を遅らせることです。私が見てきたパターンは次のとおりです。

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

あなたはできるだけ頻繁にあなたが好きなようにrunAppを呼び出すことができます。https://docs.flutter.io/flutter/widgets/runApp.html

0

また、アプリケーションの設定が完了した後、ルートウィジェットを更新するsetStateStatefulWidgetを使用することができます。併せて

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

:あなたは(短い中)のようなものを使用することができます

あなたは非同期コールバックにいるとき

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

、あなたはSETSTATEを呼び出す前に(マウント)かどうかを確認する必要がありあなたのウィジェットが既に廃棄されていないことを確認してください。さもなければ、Flutterがアサートします。 FutureBuilderは自動的にこれを行います。この特定のケースでは、StatefulWidgetがアプリケーションのルートの近くにあり、アンマウントされる可能性は低いので、おそらく問題ありませんが、構成可能なウィジェットを構築するときは良い習慣です。 –

関連する問題