Flutter:ステートフルウィジェットをflutter-reduxアプリアーキテクチャに組み合わせます

マオレーション

この質問に続いStatefulWidgetsReduxベースのフラッターアプリのコンテキストで意味をなす理由を理解しましたそしてそれは私も達成しようとしていることです-

アプリ全体の状態(ログインしたユーザーの詳細、APIデータなど)から情報が「供給」され、接続されたViewModelからアクションをディスパッチできるページですが、スコープが小さく、存続期間が短いステートフルウィジェットも含まれています。状態。アニメーション、送信前にその場でユーザー入力を検証する、ユーザーアクションに基づいてUIを変更するなど。

だから私はどのように興味があり、ここの誰かが私を助けてくれることを願っています。現在、私の「ページ」はすべて、次の方法でストアを介してアプリの状態に接続されているステートレスウィジェットです。

class LoginPage extends StatelessWidget {
  final String TAG = "LoginPage";
  bool isGreen = false;

  LoginPage({Key key}) : super(key: key);

  void changeColor() {
    isGreen = !!isGreen;
  }


  @override
  Widget build(BuildContext context) {
    /// [StoreConnector] is used to convert store data (using the fromStore)
    /// into a ViewModel suitable for the page.
    return StoreConnector<AppState, LoginPageViewModel>(
        builder: (context, viewModel) {
          return Scaffold(
              body: Column(
               children: <Widget>[
                Container(...),
                Text(
                  text: viewModel.some_value_from_the_store,
                  color: isGreen ? Colors.green : Colors.red,
                ),
                ElevatedButton(
                  onPressed: () => changeColor(),
                  child: Text('Press to change color'),
                )
            ],
          ));
        },
        converter: LoginPageViewModel.fromStore);
  }
}

ここでは、ユーザーのクリックに基づいて「LoginPage」ウィジェット内のテキストの色を変更しようとしていますが、ストアに接続したままにして、UIが到着したときに新しいアプリの状態情報で更新し続けるようにしています。

このようなものについての参照はありますか?誰かが例、またはこれを達成する方法の基本的なガイドラインを提供できますか?簡単そうに見えますが、私はそれに苦労しています。

アンドリュー

ここに役立つかもしれないいくつかのアイデアがあります。

ウィジェットはステートフルである必要があります。あなたは時間とともに変化する色を追跡しようとしています。ステートレスウィジェットは最終プロパティのみを許可します。つまり、作成時にのみ値を開始できます。

変数isGreenとメソッドchangeColor()は、状態オブジェクトの一部である必要があります。build()メソッドもそこに移動します。

次へ-メソッドを呼び出すときは、次を呼び出す必要があります。

void changeColor() {
    setState(() {isGreen = !isGreen;});
}

あなたのコードでは、値を反転していないと思います(= !! iGreenは= isGreenと同じです)。しかし、もっと重要なのは、ウィジェットを再構築する必要があることをフレームワークに伝えていないことです。これを自分でテストできます。1回クリックします(「!!」を修正した後)。何も起こりません。エミュレータで強制的に更新すると、色が変わったことがわかります。これは、手動で更新したためです。setState()はあなたに代わってそれを行います:それはあなたが提供したコードを実行し、次にFlutterを呼び出してウィジェットを更新するように指示します。参照-flutterには魔法のトリガーがなく、ウィジェットを更新するタイミングを決定するためのコードを監視しません。setState()は、そうするように指示します。

原則として、アプリケーションの状態-つまり、複数のウィジェット(またはページ)と共有されるデータは、ウィジェットツリーを「持ち上げ」、プロバイダークラスに保持する必要があります。

ステートフルウィジェットは、ウィジェットに直接関連するデータのみを保持する必要があります。通常、これはプロバイダーデータのレンダリングに役立つデータです。次に例を示します。-Providerは、表示するアイテムのリストを保持します。ステートフルウィジェットは、現在選択されているアイテムを追跡します-プロバイダーは、表示されるテキストを保持します。Statefulウィジェットはフォントサイズ、フォントの色などを保持し、ユーザーがその特定のウィジェットでそれを変更できるようにしますが、同じデータを使用するすべてのウィジェットで変更できるわけではありません。

あなたの例では、クラウドの画面に複数のログインウィジェットがあります(何らかの理由で)。その場合:-すべてのログインウィジェットの色を変更する場合-プロバイダークラスでisGreenを保持します。その場合、ウィジェットはステートレスにすることができます。-クリックしたウィジェットだけで色を変更したい場合-他の誰もこの値を気にしないので、これはステートフルウィジェットに属します。

あなたが望むことをするはずのコードでこれを更新させてください。ウィジェットをストアに接続することは、ステートフルウィジェットとステテレスウィジェットで同じように機能します。

注-ウィジェットがどのように色を変更するかを示すために、ストアに接続するコードをコメントアウトしました。ストアコードのコメントを外すと、準備が整います。

これはhttps://dartpad.dev/すばやく実行でき、コードをコピーして貼り付けるだけです。

// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: LoginPage(),
    );
  }
}

class LoginPage extends StatefulWidget {
  final String TAG = "LoginPage";
  LoginPage({Key key}) : super(key: key);
  
  @override
  _LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  
  bool isGreen = false;

  void changeColor() {
    setState(() {
      isGreen = !isGreen;
    });
    
  }

  @override
  Widget build(BuildContext context) {
    /// [StoreConnector] is used to convert store data (using the fromStore)
    /// into a ViewModel suitable for the page.
    //return StoreConnector<AppState, LoginPageViewModel>(
        //builder: (context, viewModel) {
          return Scaffold(
              body: Column(
               children: <Widget>[
                Container(),
                Text(
                  'viewModel.some_value_from_the_store',
                  style: TextStyle(color: isGreen ? Colors.green : Colors.red),
                ),
                ElevatedButton(
                  onPressed: () => changeColor(),
                  child: Text('Press to change color'),
                )
            ],
          ));
        //},
        //converter: LoginPageViewModel.fromStore);
  //}
}
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Flutterのステートフルウィジェット

分類Dev

ステートフルウィジェットはRedux / Flutterアプリで意味がありますか?

分類Dev

Flutter:子ステートフルウィジェットの維持状態

分類Dev

Flutterのステートフルウィジェットからデータを返す

分類Dev

Flutter:2つのステートフルウィジェットからデータを渡す

分類Dev

Flutterステートフルウィジェットは状態を再作成します

分類Dev

Flutterのステートフルウィジェットにテキストが表示されない

分類Dev

あるステートフルウィジェットで作成されたオブジェクトにflutterで別のステートフルウィジェットをアクセスする方法

分類Dev

Flutter-setStateが内部のステートフルウィジェットを更新しない

分類Dev

Flutter State Management(BloC):ステートレスウィジェットとステートフルウィジェット

分類Dev

Flutterでスキャフォールドウィジェットをオフセットする方法は?

分類Dev

マテリアル/テクスチャをアルファマップと組み合わせる

分類Dev

Flutterテストでウィジェットツリーを印刷する

分類Dev

Flutterのテキストウィジェットで文字のグローバル位置を特定できます

分類Dev

Flutter-ステートフルウィジェットはタブを切り替えるときにカウンター状態を保存しません

分類Dev

FreeRadiusと脆弱性スキャン/ソフトウェアステータスチェックの組み合わせ

分類Dev

NodeJSとPythonを組み合わせたアーキテクチャ?

分類Dev

Flutterウィジェットテスト-将来の完了を待つ

分類Dev

Flutter-本文の将来のビルダーテキストウィジェットで値を返す方法

分類Dev

Flutter-ウィジェットテストでテキストウィジェットを取得する方法

分類Dev

Flutter-Packagesでフィルターウィジェットを作成する

分類Dev

別のステートフルウィジェットから1つのステートフルウィジェットのメソッドを呼び出す-Flutter

分類Dev

Flutter:ステートフルウィジェットを呼び出したときにSuchMethodErrorはありません

分類Dev

Flutter:テキストウィジェットに単純なラッパーを追加します

分類Dev

Flutterのドーナツチャートの穴に円グラフを追加する方法、スタックウィジェットで試しましたが、テキストでのみ機能します

分類Dev

Scala-PlayとAngularJSを組み合わせた最適なアーキテクチャは何ですか?

分類Dev

Flutterウェブサイトをテキストウィジェットにリンクするには?

分類Dev

Androidアプリkotlinのテストのためにローカルホストをレトロフィットと組み合わせて使用する方法

分類Dev

カスタムdojoウィジェットはボタンクリック時にテキストフィールドをクリアしません

Related 関連記事

  1. 1

    Flutterのステートフルウィジェット

  2. 2

    ステートフルウィジェットはRedux / Flutterアプリで意味がありますか?

  3. 3

    Flutter:子ステートフルウィジェットの維持状態

  4. 4

    Flutterのステートフルウィジェットからデータを返す

  5. 5

    Flutter:2つのステートフルウィジェットからデータを渡す

  6. 6

    Flutterステートフルウィジェットは状態を再作成します

  7. 7

    Flutterのステートフルウィジェットにテキストが表示されない

  8. 8

    あるステートフルウィジェットで作成されたオブジェクトにflutterで別のステートフルウィジェットをアクセスする方法

  9. 9

    Flutter-setStateが内部のステートフルウィジェットを更新しない

  10. 10

    Flutter State Management(BloC):ステートレスウィジェットとステートフルウィジェット

  11. 11

    Flutterでスキャフォールドウィジェットをオフセットする方法は?

  12. 12

    マテリアル/テクスチャをアルファマップと組み合わせる

  13. 13

    Flutterテストでウィジェットツリーを印刷する

  14. 14

    Flutterのテキストウィジェットで文字のグローバル位置を特定できます

  15. 15

    Flutter-ステートフルウィジェットはタブを切り替えるときにカウンター状態を保存しません

  16. 16

    FreeRadiusと脆弱性スキャン/ソフトウェアステータスチェックの組み合わせ

  17. 17

    NodeJSとPythonを組み合わせたアーキテクチャ?

  18. 18

    Flutterウィジェットテスト-将来の完了を待つ

  19. 19

    Flutter-本文の将来のビルダーテキストウィジェットで値を返す方法

  20. 20

    Flutter-ウィジェットテストでテキストウィジェットを取得する方法

  21. 21

    Flutter-Packagesでフィルターウィジェットを作成する

  22. 22

    別のステートフルウィジェットから1つのステートフルウィジェットのメソッドを呼び出す-Flutter

  23. 23

    Flutter:ステートフルウィジェットを呼び出したときにSuchMethodErrorはありません

  24. 24

    Flutter:テキストウィジェットに単純なラッパーを追加します

  25. 25

    Flutterのドーナツチャートの穴に円グラフを追加する方法、スタックウィジェットで試しましたが、テキストでのみ機能します

  26. 26

    Scala-PlayとAngularJSを組み合わせた最適なアーキテクチャは何ですか?

  27. 27

    Flutterウェブサイトをテキストウィジェットにリンクするには?

  28. 28

    Androidアプリkotlinのテストのためにローカルホストをレトロフィットと組み合わせて使用する方法

  29. 29

    カスタムdojoウィジェットはボタンクリック時にテキストフィールドをクリアしません

ホットタグ

アーカイブ