web-dev-qa-db-ja.com

Flutterでサービス/プロバイダーをどのように作成しますか?

すべてのユーザー変数と関数を含むユーザーサービスと、すべてのアイテム変数と関数などを含む別のアイテムサービスが必要だとします。このすべてのデータと関数をプロジェクト全体で利用できるようにし、必要な場所にユーザーデータを渡します。例えば。

継承されたウィジェットと関係があると思いますが、それはどのように機能しますか?同様に、ルートレベルで1つの継承されたウィジェットを使用する方法はわかりますが、サービスごとにルートレベルで継承されたウィジェットの束を構築する必要がありますか?または、すべてのデータを1つの上位の継承ウィジェットに配置しますか?それは厄介になるかもしれないようです。私はまだこの例を見ていません。

...または、静的変数を持つクラスを使用して、必要な場所でそれを呼び出す必要がありますか?

6
Jus10

上記のGünterが提供するリンクを参照してください。 30分あれば、BrianEganのDartConf18プレゼンテーションをご覧ください: Keep it Simple、State 。ブライアンのサンプルコード ここ も参照してください。彼は、コントローラーとFlutterReduxを使用してAliExpressWidgetを使用してコーディングされた同じアプリを示しています。

これは私の単純なアプリからの単一の遺伝ウィジェットの例です...

class StateContainer extends InheritedWidget {
  final List<Membership> memberships;

  final IntFunction getNextIndex;
  final VoidMembershipFunction updateMembership;
  final VoidIntFunction deleteMembership;

  const StateContainer({
    this.memberships,
    this.getNextIndex,
    this.updateMembership,
    this.deleteMembership,
    Widget child,
  })
      : super(child: child);

  static StateContainer of(BuildContext context) {
    return context.inheritFromWidgetOfExactType(StateContainer);
  }

  @override
  bool updateShouldNotify(StateContainer oldWidget) {
    return true;
  }
}

MaterialAppを子として渡します。 StateContainerの場合、ツリーの大部分はデータとメソッドにアクセスできるため、ステートレスになります。これらは、モデルとコントローラーが1つになっていると考えることができます。ツリーのビルドメソッドは、多くの場合、...で始まります。

  @override
  Widget build(BuildContext context) {
    final StateContainer container = StateContainer.of(context);

それらにアクセスするために。

確かに、1つのInheritatedWidgetがすぐに扱いにくくなり、Reduxの探索に投資する可能性があります。講演の最後の10分間を参照してください。私の経験では、最も速く混乱する領域は、すべてのメンバー変数を比較することになったときのupdateShouldNotifyメソッドです。 (この単純な例では、メンバー変数は1つだけであり、setStateは変更されたときにのみ呼び出されるため、自明なことですが常にtrueです。)

6
Richard Heap