フラッターアプリケーションステータス管理

こんにちは、Habr! 私の記事の翻訳を提示します。アプリの状態管理ソリューションを理解して選択するのを手伝ってください 。 この翻訳に関する批判を聞いてうれしいです。 バッククォート( ``)には、私の個人的な考えや説明が書かれています。


フラッター状態管理はホットなトピックです。 問題には多くの解決策がありますが、それらに迷い込んで、あなたのニーズに最も適したものを選ぶことは非常に簡単です。 私自身は混乱していましたが、適切な解決策を見つけました。 それをあなたと共有させてください。

ニーズに合ったソリューションを見つけるには、ニーズ自体を判断する必要があります。 私の場合、これは次のとおりです。


これらの要件を考慮すると、適切なオプションは残ります。


ローカル状態とグローバル状態の違い


選択したソリューションの分析に飛び込む前に、ローカル状態とグローバル状態の違いを理解する必要があります。 実際の例はこれに適しています:
ユーザーがユーザー名とパスワードの入力を求められ、フォームを送信した後に「ユーザーID」オブジェクトを取得する認証フォームを想像してください。 この例では、フォームフィールドに入力されたデータの検証は「承認フォームウィジェット」のローカル状態の一部となり、アプリケーションの残りの部分はこれを認識すべきではありません。 また、「認可サーバー」によって返される「アイデンティティ」オブジェクトは、グローバル状態の一部です。 したがって、他のコンポーネントはこのオブジェクトに依存し、ユーザーが許可されているかどうかに応じて動作を変更します。

待つことにうんざりしている人のための簡単な結論
待ちたくない場合、または私の研究に興味がない場合は、結果の概要を以下に示します。


特に、時間の経過とともに成長する複雑なアプリケーションを構築している場合は、ローカル状態管理にBLoCを、グローバル状態にReduxを使用することをお勧めします。


setState()を使用すべきではない理由


ウィジェット内でsetState()を使用すると、これらの変更のプロトタイプをすばやく作成してフィードバックを得るのに最適ですが、表示ロジックがビジネスロジックと混ざり合っており、コードの清潔さと品質の原則に違反しているため、この方法では目標を達成できません。 このようなコードのメンテナンスは将来困難になるため、プロトタイピングを除き、このアプローチは推奨されません。

ScopedModel-正しい方向への一歩


ScopedModelは、 Brian Eganのサードパーティライブラリです。 特別なModelsオブジェクトを作成し、必要に応じてnotifyListeners()メソッドを使用することができます。 たとえば、モデルオブジェクトのプロパティの変更を追跡するには:

 class CounterModel extends Model { int _counter = 0; int get counter = _counter; void increment() { _counter++; notifyListeners(); } } 

ウィジェットでは、 ScopedModelDescendantこのライブラリが提供する」 ScopedModelDescendantウィジェットを使用して、モデルの変更に応答できます。

 class CounterApp extends StatelessWidget { @override Widget build(BuildContext context) { return new ScopedModel<CounterModel>( model: new CounterModel(), child: new Column(children: [ new ScopedModelDescendant<CounterModel>( builder: (context, child, model) => new Text('${model.counter}'), ), new Text(" ,     CounterModel") ]) ); } } 

setState()アプローチの使用とは対照的に、このソリューションでは、ビジネスロジックから表示ロジックを分離できます。 ただし、特定の制限が課されます。


これらすべてを考慮すると、アプリケーションの状態を管理するのが容易でない場合、このアプローチの使用はお勧めしません。 彼がアプリケーションの成長と複雑さを生産的に提供できるとは信じていません。

強力なソリューション-BLoC


このパターンはGoogleによって考案され、そこでも使用されています。 彼は私たちが次の目標を達成するのを助けてくれます。


このアプローチの背後にある考え方は非常に簡単です。


Googleはこの状態管理パターンを使用する良い例があります。これは、この状態管理パターンが広く使用されており、会社によって強く推奨されているためです。

私はこのアプローチを使用してローカル状態を管理することを強くお勧めしますが、グローバル状態の管理にも適しています。 ただし、後者の場合、問題が発生します-BLoCをどこ​​でどのように正しく実装して、さまざまなコンポーネントがBLoCにアクセスし、Reduxがシーンに入るか。

ReduxとBLoC-私にぴったりのミックス


記事の冒頭で説明した目標の1つは、広く使用され予測可能なものを見つけることでした。これはReduxです。これは、グローバルステートの管理に役立つパターンとツールのセットです。 コアには3つの基本原則があります。

唯一の真実のソースは 、アプリケーションのすべての状態が単一のstore内のツリーオブジェクトに格納されることです。



画像の元の投稿へのリンク

状態を管理するこのアプローチは、Web開発者に広く受け入れられており、モバイルデバイスに登場することで、Web開発者やモバイルアプリケーション開発者のメリットが得られます。

ブライアン・イーガンは、オリジナルのReduxflutter_reduxの両方を開発しています 。また、Reduxを含む多くのアーキテクチャパターンを適用した素晴らしいTodoアプリケーションも作成しました。
Reduxのすべての特性を考えると、グローバルステートの管理に使用することを強くお勧めしますが、アプリケーションをスケーリングする場合は、ローカルステートの管理には使用しないでください。

最後の言葉


この記事には、完全に正しいまたは間違った解決策はありません。 プロジェクトに適用するアプローチを決定するには、ニーズを決定する必要があります。 私と私の目標にとって、ReduxとBLoCの組み合わせにより、プロジェクトを迅速かつ安全に成長させることができ、また、アクセスしやすく明確なツールのおかげで、サードパーティ開発者がこれらのプロジェクトに参加しやすくなります。 しかし、誰もが同じニーズを持っているわけではなく、時間が経つにつれて「現在のツール」の問題とさらに良い解決策の両方を見つけることができます。 常に好奇心を持ち、このツールまたはそのツールがあなたに適しているかどうかを学び、考えることが非常に重要です。

Source: https://habr.com/ru/post/J435780/


All Articles