2017-09-05 17 views
0

私は、そのウィジェット状態の外でStatefulWidgetの状態を制御するためのベストプラクティスを理解しようとしています。StatefulWidgetの外部からの状態の制御

以下のインターフェイスが定義されています。

abstract class StartupView { 
    Stream<String> get onAppSelected; 

    set showActivity(bool activity); 
    set message(String message); 
} 

私は、このインタフェースを実装StatefulWidget StartupPageを作成したいと思います。

  1. ボタンを押すと、onAppSelectedストリームを介してイベントが送信されます。コントローラーはこれを聞いて、何らかのアクション(dbコール、サービス要求など)を実行します。

  2. コントローラーは、showActivityまたはset messageと呼んで、ビューで進行状況を示すメッセージを表示できます。

ステートフルウィジェットはプロパティとして状態を公開しないため、状態の属性にアクセスして変更するための最良の方法はわかりません。私はそれがcreateState()に戻したい状態に渡すことで、ウィジェットをインスタンス化について考えてきましたが、それは間違っていると感じ

Widget createStartupPage() { 
    var page = new StartupPage(); 
    page.onAppSelected.listen((app) { 
     page.showActivity = true; 
     //Do some work 
     page.showActivity = false; 
    }); 
    } 

:私はこれを使用することを期待する

方法は何かのようになります。

このアプローチを採用した背景についてのいくつかの背景:現在、ダーツのWebアプリケーションがあります。 View Controllerの分離、テスト容易性、そしてFlutterに向けての前向きな思考のために、我々はアプリケーションの各ビューのインターフェースを作成することに決めました。これにより、WebComponentまたはFlutterウィジェットがこのインタフェースを実装し、すべてのコントローラロジックを同じにすることができます。

答えて

2

あなたはフラッター例のいくつかは、このようにそれを行うと、私は同様にそれを使用し始めました、静的メソッドで状態のウィジェットを公開することができます。

class StartupPage extends StatefulWidget { 
    static _StartupPageState of(BuildContext context) => context.ancestorStateOfType(const TypeMatcher<_StartupPageState>()); 

    @override 
    _StartupPageState createState() => new _StartupPageState(); 
} 

class _StartupPageState extends State<StartupPage> { 
    ... 
} 

あなたはその後呼び出すことで状態にアクセスすることができますStartupPage.of(context).doSomething();

ここで注意すべき点は、ツリーのどこかにそのページを持つBuildContextを持つ必要があることです。

+0

これは妥当な解決策であれば、StatefulWidgetに状態をプロパティに格納させることも妥当でしょうか? –

+0

'createState()'はflutterによって呼び出されるライフサイクルメソッドなので、あなた自身で呼び出して返された状態を保存するべきではないという問題があります。 – xqwzts

+0

このアプローチで見られる問題は、ジェネリックコントローラがWeb上で再利用できるという設計目標に反するウィジェットツリーの一部であることが必要であるということです。 Flutterは、ウィジェット自体の状態を変更する必要があるものを強制しているようです。 –

関連する問題