Flutter-quick-guide
フラッター-はじめに
一般に、モバイルアプリケーションの開発は複雑で困難な作業です。 モバイルアプリケーションを開発するために利用できる多くのフレームワークがあります。 AndroidはJava言語に基づくネイティブフレームワークを提供し、iOSはObjective-C/Swift言語に基づくネイティブフレームワークを提供します。
ただし、両方のOSをサポートするアプリケーションを開発するには、2つの異なるフレームワークを使用して2つの異なる言語でコーディングする必要があります。 この複雑さを克服するために、両方のOSをサポートするモバイルフレームワークが存在します。 これらのフレームワークは、単純なHTMLベースのハイブリッドモバイルアプリケーションフレームワーク(ユーザーインターフェイスにHTML、アプリケーションロジックにJavaScriptを使用)から、複雑な言語固有のフレームワーク(コードをネイティブコードに変換する手間のかかる作業)に及びます。 これらのフレームワークには、単純さや複雑さに関係なく、常に多くの欠点がありますが、主な欠点の1つはパフォーマンスの低下です。
このシナリオでは、Dart言語に基づいたシンプルで高性能なフレームワークであるFlutterは、ネイティブフレームワークではなくオペレーティングシステムのキャンバスで直接UIをレンダリングすることにより、高いパフォーマンスを提供します。
Flutterは、すぐに使用できるウィジェット(UI)を多数提供して、最新のアプリケーションを作成します。 これらのウィジェットはモバイル環境向けに最適化されており、ウィジェットを使用したアプリケーションの設計はHTMLの設計と同じくらい簡単です。
具体的には、Flutterアプリケーション自体がウィジェットです。 Flutterウィジェットは、アニメーションとジェスチャーもサポートしています。 アプリケーションロジックは、リアクティブプログラミングに基づいています。 ウィジェットにはオプションで状態があります。 ウィジェットの状態を変更することにより、Flutterは自動的に(リアクティブプログラミング)ウィジェットの状態(古いものと新しいもの)を比較し、ウィジェット全体を再レンダリングする代わりに、必要な変更のみでウィジェットをレンダリングします。
完全なアーキテクチャについては、今後の章で説明します。
Flutterの機能
Flutterフレームワークは、開発者に次の機能を提供します-
- モダンでリアクティブなフレームワーク。
- Dartプログラミング言語を使用し、非常に簡単に習得できます。
- 迅速な開発
- 美しく滑らかなユーザーインターフェイス。
- 巨大なウィジェットカタログ。
- 複数のプラットフォームで同じUIを実行します。
- 高性能アプリケーション。
フラッターの利点
Flutterには、高性能で優れたモバイルアプリケーション向けの美しくカスタマイズ可能なウィジェットが付属しています。 すべてのカスタムニーズと要件を満たします。 これらに加えて、Flutterは以下で説明するように多くの利点を提供します-
- Dartには、アプリケーションの機能を拡張できるソフトウェアパッケージの大きなリポジトリがあります。
- 開発者は、両方のアプリケーション(AndroidプラットフォームとiOSプラットフォームの両方)に対して1つのコードベースのみを記述する必要があります。 _Flutter_は、将来的に他のプラットフォームにも拡張される可能性があります。
- Flutterのテストは少なくて済みます。 単一のコードベースのため、両方のプラットフォームに対して自動化されたテストを一度書くだけで十分です。
- Flutterはシンプルであるため、高速開発に適しています。 そのカスタマイズ機能と拡張性により、さらに強力になります。
- Flutterを使用すると、開発者はウィジェットとそのレイアウトを完全に制御できます。
- Flutterは、すばらしいホットリロードを備えた優れた開発者ツールを提供します。
フラッターの欠点
その多くの利点にもかかわらず、フラッターには次のような欠点があります-
- Dart言語でコーディングされているため、開発者は新しい言語を習得する必要があります(習得は簡単ですが)。
- 現代のフレームワークは、ロジックとUIを可能な限り分離しようとしますが、Flutterでは、ユーザーインターフェイスとロジックが混在しています。 スマートコーディングを使用し、高レベルモジュールを使用してユーザーインターフェイスとロジックを分離することで、これを克服できます。
- Flutterは、モバイルアプリケーションを作成するためのもう1つのフレームワークです。 開発者は、人口が非常に多いセグメントで適切な開発ツールを選択するのに苦労しています。
フラッター-インストール
この章では、ローカルコンピューターにFlutterを詳細にインストールする方法を説明します。
Windowsでのインストール
このセクションでは、_Flutter SDK_とその要件をWindowsシステムにインストールする方法を見てみましょう。
- ステップ1 *-URL [[1]] SDKをダウンロードします。 2019年4月現在、バージョンは1.2.1で、ファイルはflutter_windows_v1.2.1-stable.zipです。
- ステップ2 *-C:\ flutter \などのフォルダーでzipアーカイブを解凍します
- ステップ3 *-システムパスを更新して、flutter binディレクトリを含めます。
- ステップ4 *-Flutterは、フラッター開発のすべての要件が満たされていることを確認するツールであるflutter doctorを提供します。
- ステップ5 *-上記のコマンドを実行すると、システムが分析され、以下に示すようにレポートが表示されます-
レポートには、すべての開発ツールが利用可能であるが、デバイスが接続されていないことが記載されています。 これを修正するには、USB経由でAndroidデバイスを接続するか、Androidエミュレーターを起動します。
- ステップ6 *-flutter doctorから報告された場合、最新のAndroid SDKをインストールする
- ステップ7 *-flutter doctorから報告された場合、最新のAndroid Studioをインストールします
- ステップ8 *-Androidエミュレーターを起動するか、実際のAndroidデバイスをシステムに接続します。
- ステップ9 *-Android Studio用のFlutterおよびDartプラグインをインストールします。 新しいFlutterアプリケーションを作成するためのスタートアップテンプレート、Androidスタジオ自体でFlutterアプリケーションを実行およびデバッグするオプションなどを提供します。
- Android Studioを開きます。
- [ファイル]→[設定]→[プラグイン]をクリックします。
- Flutterプラグインを選択し、[インストール]をクリックします。
- Dartプラグインをインストールするように求められたら、[はい]をクリックします。
- Androidスタジオを再起動します。
MacOSでのインストール
MacOSにFlutterをインストールするには、次の手順に従う必要があります-
- ステップ1 *-URL [[2]] SDKをダウンロードします。 2019年4月現在、バージョンは1.2.1で、ファイルはflutter_macos_v1.2.1- stable.zipです。
- ステップ2 *-フォルダー内のzipアーカイブを解凍します。たとえば、/path/to/flutter
- ステップ3 *-システムパスを更新して、flutter binディレクトリ(〜/.bashrcファイル内)を含めます。
- ステップ4 *-以下のコマンドを使用して、現在のセッションで更新されたパスを有効にし、それも確認します。
フラッターは、フラッター開発のすべての要件が満たされていることを確認するツール、フラッタードクターを提供します。 Windowsの同等物に似ています。
- ステップ5 *-flutter doctorから報告された場合、最新のXCodeをインストールします
- ステップ6 *-flutter doctorから報告された場合、最新のAndroid SDKをインストールします
- ステップ7 *-flutter doctorから報告された場合、最新のAndroid Studioをインストールします
- ステップ8 *-Androidエミュレーターを起動するか、実際のAndroidデバイスをシステムに接続して、Androidアプリケーションを開発します。
- ステップ9 *-iOSシミュレーターを開くか、実際のiPhoneデバイスをシステムに接続してiOSアプリケーションを開発します。
- ステップ10 *-Android Studio用のFlutterおよびDartプラグインをインストールします。 新しいFlutterアプリケーションを作成するためのスタートアップテンプレート、Androidスタジオ自体でFlutterアプリケーションを実行およびデバッグするオプションなどを提供します。
- Android Studioを開きます
- [設定]→[プラグイン]をクリックします*
- Flutterプラグインを選択し、[インストール]をクリックします
- Dartプラグインをインストールするように求められたら、[はい]をクリックします。
- Androidスタジオを再起動します。
Android Studioでのシンプルなアプリケーションの作成
この章では、Android Studioでフラッターアプリケーションを作成する基本を理解するために、簡単な_Flutter_アプリケーションを作成します。
- ステップ1 *-Android Studioを開きます
ステップ2 *-Flutterプロジェクトを作成します。 そのためには、[ファイル]→[新規]→[新しいFlutterプロジェクト]をクリックします
ステップ3 *-Flutter Applicationを選択します。 このために、 *Flutter Application を選択し、 Next をクリックします。
- ステップ4 *-アプリケーションを以下のように構成し、[次へ]をクリックします。
- プロジェクト名: hello_app
- Flutter SDKパス: <path_to_flutter_sdk>
- プロジェクトの場所: <path_to_project_folder>
- 説明:フラッターベースのHello Worldアプリケーション
- ステップ5 *-プロジェクトを構成します。
会社のドメインを flutterapp.finddevguides.com として設定し、[*完了]をクリックします。
- ステップ6 *-会社のドメインを入力します。
Android Studioは、最小限の機能で完全に機能するフラッターアプリケーションを作成します。 アプリケーションの構造を確認してから、コードを変更してタスクを実行しましょう。
アプリケーションの構造とその目的は次のとおりです-
アプリケーションの構造のさまざまなコンポーネントはここで説明されています-
- アンドロイド-アンドロイドアプリケーションを作成するために自動生成されたソースコード
- ios -iOSアプリケーションを作成するために自動生成されたソースコード
- lib -flutterフレームワークを使用して記述されたDartコードを含むメインフォルダー
- ib/main.dart -Flutterアプリケーションのエントリポイント
- test -フラッターアプリケーションをテストするためのDartコードを含むフォルダー
- test/widget_test.dart -サンプルコード
- .gitignore -Gitバージョン管理ファイル
- .metadata -フラッターツールによって自動生成
- .packages -フラッターパッケージを追跡するために自動生成
- .iml -Androidスタジオで使用されるプロジェクトファイル
- pubspec.yaml -Flutterパッケージマネージャー Pub で使用
- pubspec.lock -Flutterパッケージマネージャー、 Pub によって自動生成
- README.md -Markdown形式で記述されたプロジェクト記述ファイル
- ステップ7 *-_lib/main.dartファイルのdartコードを以下のコードに置き換えます-
dartコードを1行ずつ理解してみましょう。
- *行1 *-flutterパッケージ_material_をインポートします。 マテリアルは、Androidで指定されたマテリアルデザインガイドラインに従ってユーザーインターフェイスを作成するためのフラッターパッケージです。
- *行3 *-これはFlutterアプリケーションのエントリポイントです。 _runApp_関数を呼び出して、_MyApp_クラスのオブジェクトを渡します。 _runApp_関数の目的は、指定されたウィジェットを画面に添付することです。
- *行5-17 *-ウィジェットは、フラッターフレームワークでUIを作成するために使用されます。 StatelessWidget_はウィジェットであり、ウィジェットの状態を保持しません。 _MyApp_は_StatelessWidget_を拡張し、その_buildメソッド_をオーバーライドします。 _build_メソッドの目的は、アプリケーションのUIの一部を作成することです。 ここで、_build_メソッドは、アプリケーションのルートレベルUIを作成するウィジェットである_MaterialApp_を使用します。 _title、theme _、 home_の3つのプロパティがあります。
- _title_はアプリケーションのタイトルです
- _theme_はウィジェットのテーマです。 ここでは、_ThemeData_クラスとそのプロパティ_primarySwatch_を使用して、アプリケーションの全体的な色として_blue_を設定します。
- homeはアプリケーションの内部UIで、別のウィジェット MyHomePage を設定します
- *行19-38 *-MyHomePage_は、_Scaffold Widgetを返すことを除いて、_MyApp_と同じです。 _Scaffold_は、_MaterialApp_ウィジェットの横にあるトップレベルのウィジェットで、UI準拠のマテリアルデザインを作成するために使用されます。 アプリケーションのヘッダーを表示する_appBar_と、アプリケーションの実際のコンテンツを表示するbodyの2つの重要なプロパティがあります。 _AppBar_は、アプリケーションのヘッダーをレンダリングする別のウィジェットであり、_appBar_プロパティで使用しています。 _body_プロパティでは、子ウィジェットを中央に配置する_Center_ウィジェットを使用しました。 _Text_は、テキストを表示するための最後で最も内側のウィジェットであり、画面の中央に表示されます。
ステップ8 *-次に、 *Run→Run main.dart を使用してアプリケーションを実行します
- ステップ9 *-最後に、アプリケーションの出力は次のとおりです-
Flutter-アーキテクチャアプリケーション
この章では、Flutterフレームワークのアーキテクチャについて説明します。
ウィジェット
Flutterフレームワークのコアコンセプトは* Flutterでは、すべてがウィジェットです*。 ウィジェットは基本的に、アプリケーションのユーザーインターフェイスを作成するために使用されるユーザーインターフェイスコンポーネントです。
_Flutter_では、アプリケーション自体がウィジェットです。 アプリケーションはトップレベルのウィジェットであり、そのUIは1つ以上の子(ウィジェット)を使用して構築され、子は再び子ウィジェットを使用して構築されます。 この composability 機能は、複雑なユーザーインターフェイスを作成するのに役立ちます。
たとえば、hello worldアプリケーション(前の章で作成)のウィジェット階層は、次の図で指定されています-
ここで、次の点は注目に値します-
- _MyApp_はユーザーが作成したウィジェットで、Flutterネイティブウィジェット_MaterialApp_を使用してビルドされます。
- _MaterialApp_には、ホームページのユーザーインターフェイスを指定するhomeプロパティがあります。これは、ユーザーが作成したウィジェット_MyHomePage_です。
- _MyHomePage_は、別のフラッターネイティブウィジェット_Scaffold_を使用して構築されます
- _Scaffold_には、_body_と_appBar_の2つのプロパティがあります
- _body_はメインユーザーインターフェイスを指定するために使用され、_appBar_はヘッダーユーザーインターフェイスを指定するために使用されます
- _Header UI_はフラッターネイティブウィジェットを使用してビルドされ、_AppBar_および_Body UI_は_Center_ウィジェットを使用してビルドされます。
- _Center_ウィジェットには、実際のコンテンツを参照するプロパティ_Child_があり、_Text_ウィジェットを使用して構築されます
ジェスチャー
Flutterウィジェットは、特別なウィジェット_GestureDetector_を介した対話をサポートします。 _GestureDetector_は、子ウィジェットのタップ、ドラッグなどのユーザーインタラクションをキャプチャする機能を持つ非表示のウィジェットです。 Flutterの多くのネイティブウィジェットは、_GestureDetector_の使用による相互作用をサポートしています。 _GestureDetector_ウィジェットで構成することにより、既存のウィジェットにインタラクティブ機能を組み込むこともできます。 ジェスチャーについては、今後の章で個別に学習します。
状態の概念
Flutterウィジェットは、_StatefulWidget_という特別なウィジェットを提供することにより、_State maintenance_をサポートします。 ウィジェットは、状態の維持をサポートするために_StatefulWidget_ウィジェットから派生する必要があり、他のすべてのウィジェットは_StatefulWidget_から派生する必要があります。 Flutterウィジェットはネイティブでは*リアクティブ*です。 これはreactjsに似ており、_StatefulWidget_は内部状態が変更されるたびに自動的に再レンダリングされます。 再レンダリングは、古いウィジェットと新しいウィジェットのUIの違いを見つけて、必要な変更のみをレンダリングすることにより最適化されます
レイヤー
Flutterフレームワークの最も重要な概念は、フレームワークが複雑さの観点から複数のカテゴリにグループ化され、複雑さが減少する層に明確に配置されることです。 レイヤーは、そのすぐ次のレベルのレイヤーを使用して構築されます。 最上位のレイヤーは、_Android_および_iOS_に固有のウィジェットです。 次のレイヤーには、すべてのフラッターネイティブウィジェットがあります。 次のレイヤーは_Rendering layer_です。これは低レベルのレンダラーコンポーネントであり、フラッターアプリですべてをレンダリングします。 レイヤーはコアプラットフォーム固有のコードになります
Flutterのレイヤーの一般的な概要は、以下の図に指定されています-
次のポイントは、フラッターのアーキテクチャをまとめています-
- Flutterでは、すべてがウィジェットであり、複雑なウィジェットは既存のウィジェットで構成されています。
- _GestureDetector_ウィジェットを使用すると、必要に応じてインタラクティブ機能を組み込むことができます。
- ウィジェットの状態は、_StatefulWidget_ウィジェットを使用して必要なときにいつでも維持できます。
- Flutterはレイヤー化されたデザインを提供しているため、タスクの複雑さに応じて任意のレイヤーをプログラムできます。
これらすべての概念については、今後の章で詳しく説明します。
Flutter-Dartプログラミングの概要
Dartは、オープンソースの汎用プログラミング言語です。 もともとはGoogleによって開発されました。 Dartは、Cスタイルの構文を持つオブジェクト指向言語です。 他のプログラミング言語とは異なり、インターフェイス、クラスなどのプログラミング概念をサポートしています。Dartは配列をサポートしていません。 Dartコレクションを使用して、配列、ジェネリック、オプションの型指定などのデータ構造を複製できます。
次のコードは、単純なDartプログラムを示しています-
変数とデータ型
_Variable_はストレージの場所と呼ばれ、_Data types_は単に変数と関数に関連付けられたデータのタイプとサイズを指します。
Dartは_var_キーワードを使用して変数を宣言します。 _var_の構文は以下に定義されています。
_final_および_const_キーワードは、定数を宣言するために使用されます。 それらは以下のように定義されます-
Dart言語は、次のデータ型をサポートしています-
- 数字-数値リテラル–整数および倍精度を表すために使用されます。
- 文字列-文字のシーケンスを表します。 文字列値は、一重引用符または二重引用符で指定されます。
- ブール-Dartは_bool_キーワードを使用してブール値(trueおよびfalse)を表します。
- リストとマップ-オブジェクトのコレクションを表すために使用されます。 単純なリストは以下のように定義できます-。
上記のリストは[1,2,3,4,5]リストを生成します。
マップはここに示すように定義することができます-
- 動的-変数の型が定義されていない場合、デフォルトの型は動的です。 次の例は、動的型変数を示しています-
意思決定とループ
意思決定ブロックは、命令が実行される前に条件を評価します。 DartはIf、If..elseおよびswitchステートメントをサポートしています。
ループは、特定の条件が満たされるまでコードのブロックを繰り返すために使用されます。 Dartは、for..in、while、do..whileループをサポートしています。
制御文とループの使用に関する簡単な例を理解しましょう-
上記のコードは、1〜10の偶数を出力します。
関数
関数は、特定のタスクを一緒に実行するステートメントのグループです。 ここに示すように、Dartの単純な関数を見てみましょう-
上記の関数は2つの値を追加し、出力として7を生成します。
オブジェクト指向プログラミング
Dartはオブジェクト指向言語です。 クラス、インターフェースなどのオブジェクト指向プログラミング機能をサポートしています。
クラスは、オブジェクトを作成するための青写真です。 クラス定義には次のものが含まれます-
- フィールド
- ゲッターとセッター
- コンストラクタ
- 関数
さて、上記の定義を使用して簡単なクラスを作成しましょう-
Flutter-ウィジェットの紹介
前の章で学んだように、ウィジェットはFlutterフレームワークのすべてです。 前の章で新しいウィジェットを作成する方法をすでに学びました。
この章では、ウィジェットを作成する背後にある実際の概念と、_Flutter_フレームワークで使用可能なさまざまなタイプのウィジェットを理解しましょう。
_Hello World_アプリケーションの_MyHomePage_ウィジェットを確認しましょう。 この目的のためのコードは以下のとおりです-
ここでは、_StatelessWidget_を拡張して新しいウィジェットを作成しました。
_StatelessWidget_では、派生クラスに実装される単一のメソッド_build_のみが必要であることに注意してください。 _build_メソッドは、_BuildContext_パラメーターを介してウィジェットをビルドするために必要なコンテキスト環境を取得し、ビルドしたウィジェットを返します。
コードでは、コンストラクター引数の1つとして_title_を使用し、別の引数として_Key_を使用しました。 _title_はタイトルを表示するために使用され、_Key_はビルド環境でウィジェットを識別するために使用されます。
ここで、_build_メソッドは_Scaffold_の_build_メソッドを呼び出し、_Scaffold_は_AppBar_および_Center_の_build_メソッドを呼び出して、そのユーザーインターフェイスを_build_します。
最後に、_Center_ビルドメソッドは_Text_ビルドメソッドを呼び出します。
より良い理解のために、同じものの視覚的表現を以下に示します-
ウィジェットビルドの視覚化
_Flutter_では、以下にリストするように、ウィジェットを機能に基づいて複数のカテゴリにグループ化できます-
- プラットフォーム固有のウィジェット
- レイアウトウィジェット
- 状態維持ウィジェット
- プラットフォームに依存しない/基本的なウィジェット
それぞれについて詳しく説明しましょう。
プラットフォーム固有のウィジェット
Flutterには、特定のプラットフォーム(AndroidまたはiOS)に固有のウィジェットがあります。
Android固有のウィジェットは、Android OSの_Material design guideline_に従って設計されています。 Android固有のウィジェットは、_Materialウィジェット_と呼ばれます。
iOS固有のウィジェットは、Appleの_Human Interface Guidelines_に従って設計されており、_Cupertino_ウィジェットと呼ばれます。
最も使用される材料ウィジェットのいくつかは次のとおりです-
- 足場
- AppBar
- BottomNavigationBar
- TabBar
- TabBarView
- ListTile
- RaisedButton
- FloatingActionButton
- フラットボタン
- IconButton
- DropdownButton
- PopupMenuButton
- ButtonBar
- テキストフィールド
- チェックボックス
- 無線
- スイッチ
- スライダー
- 日付と時刻のピッカー
- SimpleDialog
- AlertDialog
最も使用される_Cupertino_ウィジェットのいくつかは次のとおりです-
- クパチーノボタン
- クパチーノピッカー
- クパチーノデイトピッカー
- CupertinoTimerPicker
- CupertinoNavigationBar
- CupertinoTabBar
- クパチーノタブ足場
- CupertinoTabView
- CupertinoTextField
- クパチーノダイアログ
- CupertinoDialogAction
- CupertinoFullscreenDialogTransition
- CupertinoPageScaffold
- CupertinoPageTransition
- クパチーノアクションシート
- CupertinoActivityIndicator
- CupertinoAlertDialog
- CupertinoPopupSurface
- クパチーノスライダー
レイアウトウィジェット
Flutterでは、1つ以上のウィジェットを構成することでウィジェットを作成できます。 複数のウィジェットを単一のウィジェットに合成するために、_Flutter_はレイアウト機能を備えた多数のウィジェットを提供します。 たとえば、子ウィジェットは、_Center_ウィジェットを使用して中央に配置できます。
人気のあるレイアウトウィジェットのいくつかは次のとおりです-
- コンテナ-背景、境界線、影付きの_BoxDecoration_ウィジェットを使用して装飾された長方形のボックス。
- Center -子ウィジェットを中央に配置します。
- 行-子を水平方向に配置します。
- 列-子を垂直方向に配置します。
- スタック-上下に並べます。
レイアウトウィジェットの詳細については、今後の「レイアウトウィジェットの紹介」の章で確認します。
状態維持ウィジェット
Flutterでは、すべてのウィジェットは_StatelessWidget_または_StatefulWidget_から派生します。
_StatelessWidget_から派生したウィジェットには状態情報はありませんが、_StatefulWidget_から派生したウィジェットを含めることができます。 アプリケーションの動的な性質は、ウィジェットの対話型動作と対話中の状態の変化によるものです。 たとえば、カウンターボタンをタップすると、カウンターの内部状態が1つずつ増加/減少し、_Flutter_ウィジェットの反応性により、新しい状態情報を使用してウィジェットが自動的に再レンダリングされます。
_StatefulWidget_ウィジェットの概念については、今後の_State管理の章で詳しく学習します。
プラットフォームに依存しない/基本的なウィジェット
_Flutter_は、プラットフォームに依存しない方法で単純なユーザーインターフェイスと複雑なユーザーインターフェイスを作成するための多数の基本的なウィジェットを提供します。 この章の基本的なウィジェットのいくつかを見てみましょう。
テキスト
_Text_ウィジェットは、文字列を表示するために使用されます。 文字列のスタイルは、_style_プロパティと_TextStyle_クラスを使用して設定できます。 この目的のためのサンプルコードは次のとおりです-
_Text_ウィジェットには、_Text.rich_という特別なコンストラクターがあり、_TextSpan_型の子を受け入れて、異なるスタイルの文字列を指定します。 _TextSpan_ウィジェットは本質的に再帰的であり、_TextSpan_をその子として受け入れます。 この目的のためのサンプルコードは次のとおりです-
_Text_ウィジェットの最も重要なプロパティは次のとおりです-
- maxLines、int -表示する最大行数
- overflow、TextOverFlow -_TextOverFlow_クラスを使用して視覚的なオーバーフローを処理する方法を指定します
- style、TextStyle -_TextStyle_クラスを使用して文字列のスタイルを指定します
- textAlign、TextAlign -_TextAlign_クラスを使用した、右、左、両端揃えなどのテキストの配置
- textDirection、TextDirection -フローするテキストの方向、左から右または右から左
画像
_Image_ウィジェットは、アプリケーションで画像を表示するために使用されます。 _Image_ウィジェットは、複数のソースから画像をロードするためのさまざまなコンストラクタを提供し、それらは次のとおりです-
- 画像-_ImageProvider_を使用した汎用画像ローダー
- Image.asset -flutterプロジェクトのアセットから画像を読み込みます
- Image.file -システムフォルダから画像をロード
- Image.memory -メモリから画像をロード
- Image.Network -ネットワークから画像をロード
_Flutter_に画像を読み込んで表示する最も簡単なオプションは、画像をアプリケーションのアセットとして含め、オンデマンドでウィジェットに読み込むことです。
- プロジェクトフォルダーにフォルダーとアセットを作成し、必要な画像を配置します。
- 以下に示すように、pubspec.yamlでアセットを指定します-
- 次に、アプリケーションに画像をロードして表示します。
- hello worldアプリケーションの_MyHomePage_ウィジェットの完全なソースコードと結果は、以下のようになります-
ロードされた画像は以下のようになります-
_Image_ウィジェットの最も重要なプロパティは次のとおりです-
- image、ImageProvider -ロードする実際の画像
- width、double -画像の幅
- height、double -画像の高さ
- alignment、AlignmentGeometry -境界内で画像を配置する方法
アイコン
_Icon_ウィジェットは、_IconData_クラスで説明されているフォントからグリフを表示するために使用されます。 シンプルなメールアイコンをロードするコードは次のとおりです-
Hello Worldアプリケーションに適用する完全なソースコードは次のとおりです-
ロードされたアイコンは以下のとおりです-
Flutter-レイアウトの概要
_Flutter_の中心概念は_Everything_が_widget_であるため、_Flutter_はウィジェット自体にユーザーインターフェイスレイアウト機能を組み込んでいます。 _Flutter_は、_Container、Center、Align_などの特別に設計された多くのウィジェットを提供しますが、これらはユーザーインターフェイスをレイアウトするためだけのものです。 ウィジェットは、他のウィジェットを構成することにより構築され、通常はレイアウトウィジェットを使用します。 この章の_Flutter_レイアウトの概念を学んでみましょう。
レイアウトウィジェットのタイプ
レイアウトウィジェットは、その子に基づいて2つの異なるカテゴリにグループ化することができます-
- 単一の子をサポートするウィジェット
- 複数の子をサポートするウィジェット
今後のセクションで、ウィジェットのタイプとその機能の両方を学びましょう。
単一の子ウィジェット
このカテゴリでは、ウィジェットには子として1つのウィジェットのみがあり、すべてのウィジェットには特別なレイアウト機能があります。
たとえば、_Center_ウィジェットは、親ウィジェットに対して子ウィジェットを中央に配置するだけで、_Container_ウィジェットは、パディング、装飾などのさまざまなオプションを使用して、その内部の任意の場所に子を配置する完全な柔軟性を提供します。
単一の子ウィジェットは、ボタン、ラベルなどの単一の機能を備えた高品質のウィジェットを作成するための優れたオプションです。
_Container_ウィジェットを使用してシンプルなボタンを作成するコードは次のとおりです-
ここでは、_Container_ウィジェットと_Text_ウィジェットの2つのウィジェットを使用しました。 ウィジェットの結果は、以下に示すようにカスタムボタンとしてです-
_Flutter_が提供する最も重要な単一の子レイアウトウィジェットのいくつかをチェックしましょう−
- Padding -指定されたパディングで子ウィジェットを配置するために使用されます。 ここでは、_EdgeInsets_クラスによってパディングを提供できます。
- Align -_alignment_プロパティの値を使用して、子ウィジェットをそれ自体内で位置合わせします。 _alignment_プロパティの値は、_FractionalOffset_クラスによって提供できます。 _FractionalOffset_クラスは、左上からの距離でオフセットを指定します。
オフセットの可能な値のいくつかは次のとおりです-
- FractionalOffset(1.0、0.0)は右上を表します。
- FractionalOffset(0.0、1.0)は左下を表します。
オフセットに関するサンプルコードを以下に示します-
- FittedBox -子ウィジェットをスケーリングし、指定されたフィットに応じて配置します。
- AspectRatio -指定されたアスペクト比に子ウィジェットのサイズを変更しようとします
- ConstrainedBox
- ベースライン
- FractinallySizedBox
- IntrinsicHeight
- IntrinsicWidth
- LiimitedBox
- オフステージ
- OverflowBox
- SizedBox
- SizedOverflowBox
- 変換する
- CustomSingleChildLayout
私たちのhello worldアプリケーションは、マテリアルベースのレイアウトウィジェットを使用してホームページを設計しています。 hello worldアプリケーションを変更して、以下に指定されている基本的なレイアウトウィジェットを使用してホームページを構築します。
- Container -位置合わせ、パディング、境界線、マージンを備えた汎用の単一の子、ボックスベースのコンテナウィジェットと豊富なスタイリング機能。
- Center -子ウィジェットを中央に配置するシンプルな単一の子コンテナウィジェット。
_MyHomePage_および_MyApp_ウィジェットの変更されたコードは以下のとおりです-
ここに、
- _Container_ウィジェットは、トップレベルまたはルートウィジェットです。 _Container_は、_decoration_および_padding_プロパティを使用してコンテンツをレイアウトするように構成されます。
- _BoxDecoration_には、_Container_ウィジェットを装飾するための色、境界線などの多くのプロパティがあり、ここでは、_color_を使用してコンテナの色を設定します。
- _Container_ウィジェットの_padding_は、パディング値を指定するオプションを提供する_dgeInsets_クラスを使用して設定されます。
- _Center_は、_Container_ウィジェットの子ウィジェットです。 繰り返しますが、_Text_は_Center_ウィジェットの子です。 _Text_はメッセージを表示するために使用され、_Center_は親ウィジェット_Container_に対してテキストメッセージを中央に配置するために使用されます。
上記のコードの最終結果は、以下に示すようなレイアウトサンプルです-
複数の子ウィジェット
このカテゴリでは、特定のウィジェットに複数の子ウィジェットがあり、各ウィジェットのレイアウトは一意です。
たとえば、_Row_ウィジェットでは、子を水平方向にレイアウトできますが、_Column_ウィジェットでは、子を垂直方向にレイアウトできます。 _Row_と_Column_を構成することにより、あらゆるレベルの複雑さを持つウィジェットを構築できます。
このセクションで頻繁に使用されるウィジェットのいくつかを学びましょう。
- 行-子を水平方向に配置できます。
- 列-子を垂直方向に配置できます。
- ListView -子をリストとして配置できます。
- GridView -子をギャラリーとして配置できます。
- Expanded -Row and Columnウィジェットの子を作成して、可能な限り最大の領域を占めるようにします。
- Table -テーブルベースのウィジェット。
- Flow -フローベースのウィジェット。
- Stack -スタックベースのウィジェット。
高度なレイアウトアプリケーション
このセクションでは、単一および複数の子レイアウトウィジェットを使用して、カスタムデザインで_product Listing_の複雑なユーザーインターフェイスを作成する方法を学びましょう。
この目的のために、以下に示すシーケンスに従ってください-
- Androidスタジオで_product_layout_app_に新しい_Flutter_アプリケーションを作成します。
- _main.dart_コードを次のコードに置き換えます-
- ここに、
- デフォルトの_StatefulWidget_の代わりに_StatelessWidget_を拡張して_MyHomePage_ウィジェットを作成し、関連するコードを削除しました。
- 次に、以下に示すように、指定されたデザインに従って、_ProductBox_という新しいウィジェットを作成します-
- _ProductBox_のコードは次のとおりです。
- コードで次のことに注意してください-
_ProductBox_は、以下に指定されている4つの引数を使用しています-
- name-製品名
- 説明-製品の説明
- 価格-製品の価格
- 画像-製品の画像
_ProductBox_は、以下に指定されている7つの組み込みウィジェットを使用します-
- 容器
- 拡大
- Row
- カラム
- Card
- Text
- 画像
_ProductBox_は、上記のウィジェットを使用して設計されています。 ウィジェットの配置または階層は、以下に示す図で指定されています-
- さて、アプリケーションのassetsフォルダに製品情報のダミー画像(以下を参照)を配置し、以下に示すようにpubspec.yamlファイルでassetsフォルダを設定します-
iPhone.png
Pixel.png
Laptop.png
Tablet.png
Pendrive.png
Floppy.png
最後に、以下に指定されているように、_MyHomePage_ウィジェットで_ProductBox_ウィジェットを使用します-
- ここでは、_ListView_ウィジェットの子として_ProductBox_を使用しました。
- 製品レイアウトアプリケーション_(product_layout_app)の完全なコード(main.dart)_は次のとおりです-
アプリケーションの最終的な出力は次のとおりです-
フラッター-ジェスチャーの紹介
_ジェスチャー_は、主にユーザーがモバイル(またはタッチベースのデバイス)アプリケーションと対話する方法です。 ジェスチャは、一般に、モバイルデバイスの特定のコントロールをアクティブにすることを目的とした、ユーザーの物理的な動作/動きとして定義されます。 ジェスチャーは、モバイルデバイスの画面をタップして、ゲームアプリケーションで使用されるより複雑なアクションを実行するのと同じくらい簡単です。
広く使用されているジェスチャのいくつかはここに記載されています-
- タップ-指先で短時間デバイスの表面に触れてから指先を離します。
- ダブルタップ-短時間で2回タップ。
- ドラッグ-指先でデバイスの表面に触れてから、安定した方法で指先を動かし、最後に指先を離します。
- フリック-ドラッグに似ていますが、より高速に実行します。
- ピンチ-2本の指でデバイスの表面をつまむ。
- スプレッド/ズーム-ピンチの反対。
- パンニング-指先でデバイスの表面に触れ、指先を離さずに任意の方向に動かします。
Flutterは、専用のウィジェットである GestureDetector を介して、あらゆる種類のジェスチャに対する優れたサポートを提供します。 GestureDetectorは、主にユーザーのジェスチャーを検出するために使用される非視覚的なウィジェットです。 ウィジェットを対象とするジェスチャを識別するために、ウィジェットをGestureDetectorウィジェット内に配置できます。 GestureDetectorはジェスチャをキャプチャし、ジェスチャに基づいて複数のイベントをディスパッチします。
ジェスチャのいくつかと対応するイベントを以下に示します-
Tap
- onTapDown
- onTapUp
- onTap
- onTapCancel
ダブルタップ
- onDoubleTap
長押し
- onLongPress
垂直ドラッグ
- onVerticalDragStart
- onVerticalDragUpdate
- onVerticalDragEnd
水平ドラッグ
- onHorizontalDragStart
- onHorizontalDragUpdate
- onHorizontalDragEnd
Pan
- onPanStart
- onPanUpdate
- onPanEnd
ここで、hello worldアプリケーションを変更してジェスチャ検出機能を含め、概念を理解してみましょう。
- 以下に示すように、_MyHomePage_ウィジェットの本文の内容を変更します-
- ここで、ウィジェット階層のTextウィジェットの上に_GestureDetector_ウィジェットを配置し、onTapイベントをキャプチャし、最後にダイアログウィンドウを表示したことに注目してください。
- _showDialog 関数を実装して、ユーザーが_hello world message_をタブで移動したときにダイアログを表示します。 汎用の_showDialog_および_AlertDialog_ウィジェットを使用して、新しいダイアログウィジェットを作成します。 コードは以下に示されています-
- アプリケーションは、ホットリロード機能を使用してデバイスにリロードします。 今、メッセージ、Hello Worldをクリックするだけで、以下のようなダイアログが表示されます-
- 次に、ダイアログの_close_オプションをクリックして、ダイアログを閉じます。
- 完全なコード(main.dart)は次のとおりです-
最後に、Flutterは_Listener_ウィジェットを介して低レベルのジェスチャー検出メカニズムも提供します。 すべてのユーザーインタラクションを検出し、次のイベントをディスパッチします-
- PointerDownEvent
- PointerMoveEvent
- PointerUpEvent
- PointerCancelEvent
Flutterは、特定のジェスチャだけでなく高度なジェスチャを実行するための小さなウィジェットセットも提供します。 ウィジェットは以下のとおりです-
- Dismissible -ウィジェットを閉じるフリックジェスチャをサポートします。
- ドラッグ可能-ウィジェットを移動するためのドラッグジェスチャーをサポートしています。
- LongPressDraggable -親ウィジェットもドラッグ可能な場合、ウィジェットを移動するドラッグジェスチャをサポートします。
- DragTarget -_Draggable_ウィジェットを受け入れます
- IgnorePointer -ジェスチャ検出プロセスからウィジェットとその子を非表示にします。
- AbsorbPointer -ジェスチャ検出プロセス自体を停止するため、重複するウィジェットもジェスチャ検出プロセスに参加できないため、イベントは発生しません。
- スクロール可能-ウィジェット内で利用可能なコンテンツのスクロールをサポートします。
序章
状態管理には、アプリケーション全体の状態変化の追跡が含まれます。
プロバイダーパッケージは、状態管理のニーズに対応する1つのソリューションです。
この記事では、provider
をサンプルのFlutterアプリケーションに適用して、ユーザーアカウント情報の状態を管理する方法を学習します。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- Flutterをダウンロードしてインストールします。
- Android StudioまたはVisual StudioCodeをダウンロードしてインストールするには。
- コードエディタ用のプラグインをインストールすることをお勧めします。 AndroidStudio用にインストールされたFlutterおよびDartプラグイン。 VisualStudioCode用にインストールされたFlutter拡張機能。
- ナビゲーションとルートに精通していることは有益ですが、必須ではありません。
- フォームの状態に精通していることも有益ですが、必須ではありません。
このチュートリアルは、Flutter v2.0.6、Android SDK v31.0.2、およびAndroidStudiov4.1で検証されました。
問題を理解する
名前などのユーザーのデータを使用して画面の一部をカスタマイズするアプリを作成する場合を考えてみます。 画面間でデータを渡すための通常の方法は、すぐにコールバック、未使用のデータ、および不必要に再構築されたウィジェットの絡み合った混乱になります。 Reactのようなフロントエンドライブラリでは、これはプロップドリルと呼ばれる一般的な問題です。
これらのウィジェットのいずれかからデータを渡したい場合は、未使用のコールバックを増やすことで、すべての中間ウィジェットをさらに膨らませる必要があります。 ほとんどの小さな機能の場合、これにより、ほとんど努力する価値がなくなる可能性があります。
幸いなことに、provider
パッケージを使用すると、MaterialApp
を初期化する場合と同様に、上位のウィジェットにデータを保存し、サブウィジェットから直接アクセスして変更することができます。ネストし、その間のすべてを再構築せずに。
ステップ1—プロジェクトの設定
Flutter用に環境を設定したら、次のコマンドを実行して新しいアプリケーションを作成できます。
flutter create flutter_provider_example
新しいプロジェクトディレクトリに移動します。
cd flutter_provider_example
flutter create
を使用すると、ボタンがクリックされた回数を表示するデモアプリケーションが作成されます。
ステップ2—provider
プラグインを追加する
次に、pubspec.yaml
内にprovider
プラグインを追加する必要があります。
pubspec.yaml
dependencies: flutter: sdk: flutter provider: ^3.1.0
次に、変更をファイルに保存します。
注: VS Codeを使用している場合は、依存関係をすばやく追加するために PubspecAssist拡張機能の使用を検討することをお勧めします。
これで、iOSまたはAndroidシミュレーター、または選択したデバイスでこれを実行できます。
ステップ3—プロジェクトの足場
2つの画面、ルーター、およびナビゲーションバーが必要になります。 アカウントデータを表示するページと、ルーターから保存、変更、受け継がれる状態自体で更新するページを設定しています。
コードエディタでmain.dart
を開き、次のコード行を変更します。
lib / main.dart
import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import './screens/account.dart'; import './screens/settings.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Provider Demo', home: MyHomePage(), ); } } class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { @override Widget build(BuildContext context) { return MaterialApp(home: AccountScreen(), routes: { 'account_screen': (context) => AccountScreen(), 'settings_screen': (context) => SettingsScreen(), }); } }
navbar.dart
ファイルを作成し、コードエディタで開きます。
lib / navbar.dart
import 'package:flutter/material.dart'; import './screens/account.dart'; import './screens/settings.dart'; class Navbar extends StatelessWidget { @override Widget build(BuildContext context) { return Container( color: Colors.blue, child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: <Widget>[ TextButton( onPressed: () => Navigator.pushReplacementNamed(context, AccountScreen.id), child: Icon(Icons.account_circle, color: Colors.white) ), TextButton( onPressed: () => Navigator.pushReplacementNamed(context, SettingsScreen.id), child: Icon(Icons.settings, color: Colors.white) ), ], ), ); } }
lib
ディレクトリに、新しいscreens
サブディレクトリを作成します。
mkdir lib/screens
このサブディレクトリに、settings.dart
ファイルを作成します。 これは、フォームの状態を作成し、入力を保存するためのマップを設定し、後で使用する送信ボタンを追加するために使用されます。
lib /screens/settings.dart
import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../main.dart'; import '../navbar.dart'; class SettingsScreen extends StatelessWidget { static const String id = 'settings_screen'; final formKey = GlobalKey<FormState>(); final Map data = {'name': String, 'email': String, 'age': int}; @override Widget build(BuildContext context) { return Scaffold( bottomNavigationBar: Navbar(), appBar: AppBar(title: Text('Change Account Details')), body: Center( child: Container( padding: EdgeInsets.symmetric(vertical: 20, horizontal: 30), child: Form( key: formKey, child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: <Widget>[ TextFormField( decoration: InputDecoration(labelText: 'Name'), onSaved: (input) => data['name'] = input, ), TextFormField( decoration: InputDecoration(labelText: 'Email'), onSaved: (input) => data['email'] = input, ), TextFormField( decoration: InputDecoration(labelText: 'Age'), onSaved: (input) => data['age'] = input, ), TextButton( onPressed: () => formKey.currentState.save(), child: Text('Submit'), style: TextButton.styleFrom( primary: Colors.white, backgroundColor: Colors.blue, ), ) ] ), ), ), ), ); } }
また、このサブディレクトリに、account.dart
ファイルを作成します。 これは、アカウント情報を表示するために使用されます。
lib /screens/account.dart
import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../main.dart'; import '../navbar.dart'; class AccountScreen extends StatelessWidget { static const String id = 'account_screen'; @override Widget build(BuildContext context) { return Scaffold( bottomNavigationBar: Navbar(), appBar: AppBar( title: Text('Account Details'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text('Name: '), Text('Email: '), Text('Age: '), ], ), ), ); } }
コードをコンパイルして、エミュレーターで実行します。
この時点で、アカウント画面と設定画面を備えたアプリケーションができました。
ステップ4—Provider
を使用する
provider
を設定するには、MaterialApp
をProvider
にデータの種類でラップする必要があります。
main.dart
に再度アクセスして、コードエディタで開きます。 このチュートリアルでは、データ型はMap
です。 最後に、create
を設定して、context
とdata
を使用する必要があります。
lib / main.dart
// ... class _MyHomePageState extends State<MyHomePage> { Map data = { 'name': 'Sammy Shark', 'email': 'example@example.com', 'age': 42 }; @override Widget build(BuildContext context) { return Provider<Map>( create: (context) => data, child: MaterialApp(home: AccountScreen(), routes: { 'account_screen': (context) => AccountScreen(), 'settings_screen': (context) => SettingsScreen(), }), ); } }
data
マップは、main.dart
がprovider
パッケージを呼び出してインポートする他のすべての画面とウィジェットで使用できるようになりました。
Provider
クリエーターに渡したものはすべて、Provider.of<Map>(context)
で利用できるようになりました。 渡すタイプは、Provider
が期待するデータのタイプと一致する必要があることに注意してください。
注: VS Codeを使用している場合は、provider
に頻繁にアクセスする可能性があるため、スニペットの使用を検討することをお勧めします。
dart.json
"Provider": { "prefix": "provider", "body": [ "Provider.of<$1>(context).$2" ] }
account.dart
に再度アクセスして、コードエディタで開きます。 次のコード行を追加します。
lib /screens/account.dart
// ... body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text('Name: ' + Provider.of<Map>(context)['name'].toString()), Text('Email: ' + Provider.of<Map>(context)['email'].toString()), Text('Age: ' + Provider.of<Map>(context)['age'].toString()), ]), ), ) // ...
コードをコンパイルして、エミュレーターで実行します。
この時点で、アカウント画面に表示されるハードコードされたユーザーデータを含むアプリケーションがあります。
ステップ5—ChangeNotifier
を使用する
Provider
をこのように使用すると、非常にトップダウンのように見えます。データを渡し、マップを変更したい場合はどうでしょうか。 Provider
だけでは十分ではありません。 まず、データをChangeNotifier
を拡張する独自のクラスに分割する必要があります。 Provider
はそれでは機能しないため、ChangeNotifierProvider
に変更し、代わりにData
クラスのインスタンスを渡す必要があります。
これで、単一の変数だけでなく、クラス全体を渡すことになります。これは、データを操作できるメソッドの作成を開始できることを意味します。このメソッドは、Provider
にアクセスするすべてのユーザーが利用できます。
グローバルデータのいずれかを変更した後、notifyListeners
を使用します。これにより、それに依存するすべてのウィジェットが再構築されます。
main.dart
に再度アクセスして、コードエディタで開きます。
lib / main.dart
// ... class _MyHomePageState extends State<MyHomePage> { @override Widget build(BuildContext context) { return ChangeNotifierProvider<Data>( create: (context) => Data(), child: MaterialApp(home: AccountScreen(), routes: { 'account_screen': (context) => AccountScreen(), 'settings_screen': (context) => SettingsScreen(), }), ); } } class Data extends ChangeNotifier { Map data = { 'name': 'Sammy Shark', 'email': 'example@example.com', 'age': 42 }; void updateAccount(input) { data = input; notifyListeners(); } }
Provider
タイプを変更したため、そのタイプへの呼び出しを更新する必要があります。 account.dart
に再度アクセスして、コードエディタで開きます。
lib /screens/account.dart
// ... body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text('Name: ' + Provider.of<Data>(context).data['name'].toString()), Text('Email: ' + Provider.of<Data>(context).data['email'].toString()), Text('Age: ' + Provider.of<Data>(context).data['age'].toString()), ]), ), ) // ...
データを渡すには、Data
クラスで渡されたメソッドを使用してProvider
にアクセスする必要があります。 settings.dart
に再度アクセスして、コードエディタで開きます。
lib /screens/settings.dart
TextButton( onPressed: () { formKey.currentState.save(); Provider.of<Data>(context, listen: false).updateAccount(data); formKey.currentState.reset(); }, )
コードをコンパイルして、エミュレーターで実行します。
この時点で、[設定]画面でのユーザー情報の更新と[アカウント]画面での変更の表示をサポートするアプリケーションができました。
結論
この記事では、provider
をサンプルのFlutterアプリケーションに適用して、ユーザーアカウント情報の状態を管理する方法を学びました。
Flutterについて詳しく知りたい場合は、Flutterトピックページで演習とプログラミングプロジェクトを確認してください。
フラッター-アニメーション
アニメーションは、モバイルアプリケーションでは複雑な手順です。 複雑さにもかかわらず、Animationはユーザーエクスペリエンスを新しいレベルに高め、リッチなユーザーインタラクションを提供します。 その豊富さにより、アニメーションは現代のモバイルアプリケーションの不可欠な部分になります。 Flutterフレームワークは、アニメーションの重要性を認識し、あらゆる種類のアニメーションを開発するためのシンプルで直感的なフレームワークを提供します。
前書き
アニメーションは、特定の時間内に特定の順序で一連の画像/画像を表示して、動きの錯覚を与えるプロセスです。 アニメーションの最も重要な側面は次のとおりです-
- アニメーションには、開始値と終了値の2つの異なる値があります。 アニメーションは_Start_値から始まり、一連の中間値を通過し、最終的に終了値で終了します。 たとえば、ウィジェットをアニメーション化してフェードアウトさせる場合、初期値は完全な不透明度になり、最終値は不透明度ゼロになります。
- 中間値は、本質的に線形または非線形(曲線)であり、構成できます。 アニメーションは設定どおりに機能することを理解してください。 各構成は、アニメーションに異なる感触を提供します。 たとえば、ウィジェットのフェードは本質的に線形になりますが、ボールの跳ね返りは本質的に非線形になります。
- アニメーションプロセスの継続時間は、アニメーションの速度(低速または高速)に影響します。
- アニメーションの開始、アニメーションの停止、アニメーションの繰り返し回数の設定、アニメーションのプロセスの反転など、アニメーションプロセスを制御する機能。
- Flutterでは、アニメーションシステムは実際のアニメーションを行いません。 代わりに、画像をレンダリングするためにすべてのフレームで必要な値のみを提供します。
アニメーションベースのクラス
フラッターアニメーションシステムは、アニメーションオブジェクトに基づいています。 コアアニメーションクラスとその使用法は次のとおりです-
アニメーション
特定の期間にわたって2つの数値の間に補間値を生成します。 最も一般的なアニメーションのクラスは-
- Animation <double> -2つの10進数の間の値を補間します
- Animation <Color> -2つの色の間の色を補間する
- Animation <Size> -2つのサイズの間のサイズを補間します
- AnimationController -アニメーション自体を制御する特別なアニメーションオブジェクト。 アプリケーションが新しいフレームの準備ができるたびに新しい値を生成します。 リニアベースのアニメーションをサポートし、値は0.0から1.0で始まります
ここで、コントローラーはアニメーションを制御し、持続時間オプションはアニメーションプロセスの持続時間を制御します。 vsyncは、アニメーションで使用されるリソースを最適化するために使用される特別なオプションです。
曲線アニメーション
AnimationControllerに似ていますが、非線形アニメーションをサポートしています。 CurvedAnimationは、以下のようにAnimationオブジェクトとともに使用できます-
トゥイーン<T>
Animatable <T>から派生し、0と1以外の2つの数値の間の数値を生成するために使用されます。 animateメソッドを使用して実際のAnimationオブジェクトを渡すことにより、Animationオブジェクトと共に使用できます。
- Tweenは、以下のようにCurvedAnimationとともに使用することもできます-
ここで、コントローラーは実際のアニメーションコントローラーです。 curveは非線形性のタイプを提供し、customTweenは0〜255のカスタム範囲を提供します。
Flutter Animationのワークフロー
アニメーションのワークフローは次のとおりです-
- StatefulWidgetのinitStateでアニメーションコントローラーを定義して開始します。
- アニメーションベースのリスナー、addListenerを追加して、ウィジェットの状態を変更します。
- ビルドインウィジェット、AnimatedWidgetおよびAnimatedBuilderを使用して、このプロセスをスキップできます。 両方のウィジェットはAnimationオブジェクトを受け入れ、アニメーションに必要な現在の値を取得します。
- ウィジェットのビルドプロセス中にアニメーション値を取得し、元の値の代わりに幅、高さ、または関連するプロパティに適用します。
実用的なアプリケーション
Flutterフレームワークのアニメーションの概念を理解するために、簡単なアニメーションベースのアプリケーションを作成しましょう。
- Androidスタジオでproduct_animation_appに新しい_Flutter_アプリケーションを作成します。
- アセットフォルダーをproduct_nav_appからproduct_animation_appにコピーし、pubspec.yamlファイル内にアセットを追加します。
- デフォルトの起動コード(main.dart)を削除します。
- インポートと基本的なメイン機能を追加します。
- StatefulWidgtetから派生したMyAppウィジェットを作成します。
- _MyAppStateウィジェットを作成し、デフォルトのビルドメソッドに加えてinitStateを実装して破棄します。
ここに、
- initStateメソッドでは、アニメーションコントローラーオブジェクト(コントローラー)、アニメーションオブジェクト(アニメーション)を作成し、controller.forwardを使用してアニメーションを開始しました。
- disposeメソッドでは、アニメーションコントローラーオブジェクト(コントローラー)を破棄しました。
- buildメソッドで、コンストラクターを介してMyHomePageウィジェットにアニメーションを送信します。 これで、MyHomePageウィジェットはアニメーションオブジェクトを使用してそのコンテンツをアニメーション化できます。
- 次に、ProductBoxウィジェットを追加します
- 新しいウィジェットMyAnimatedWidgetを作成して、不透明度を使用した単純なフェードアニメーションを作成します。
- ここでは、AniatedBuilderを使用してアニメーションを作成しました。 AnimatedBuilderは、同時にアニメーションを実行しながらコンテンツを構築するウィジェットです。 アニメーションオブジェクトを受け入れて、現在のアニメーション値を取得します。 アニメーション値、animation.valueを使用して、子ウィジェットの不透明度を設定しました。 実際には、ウィジェットは不透明度の概念を使用して子ウィジェットをアニメーション化します。
- 最後に、MyHomePageウィジェットを作成し、アニメーションオブジェクトを使用してそのコンテンツをアニメーション化します。
ここでは、FadeAnimationとMyAnimationWidgetを使用して、リストの最初の2つのアイテムをアニメーション化しました。 FadeAnimationはビルドインアニメーションクラスであり、不透明度の概念を使用して子をアニメーション化するために使用しました。
- 完全なコードは次のとおりです-
- アプリケーションをコンパイルして実行し、結果を確認します。 アプリケーションの初期および最終バージョンは次のとおりです-
Flutter-Android固有のコードを書く
Flutterは、プラットフォーム固有の機能にアクセスするための一般的なフレームワークを提供します。 これにより、開発者はプラットフォーム固有のコードを使用して_Flutter_フレームワークの機能を拡張できます。 フレームワークを介して、カメラ、バッテリーレベル、ブラウザなどのプラットフォーム固有の機能に簡単にアクセスできます。
プラットフォーム固有のコードにアクセスする一般的な考え方は、単純なメッセージングプロトコルを使用することです。 フラッターコード、クライアント、プラットフォームコード、およびホストは、共通のメッセージチャネルにバインドします。 クライアントは、メッセージチャネルを介してホストにメッセージを送信します。 ホストはメッセージチャネルをリッスンし、メッセージを受信して必要な機能を実行し、最後にメッセージチャネルを介してクライアントに結果を返します。
プラットフォーム固有のコードアーキテクチャは、以下のブロック図に示されています-
メッセージングプロトコルは、数値、文字列、ブール値などのJSONのような値のバイナリシリアル化をサポートする標準メッセージコーデック(StandardMessageCodecクラス)を使用します。シリアル化と逆シリアル化は、クライアントとホストの間で透過的に機能します。
_Android SDK_を使用してブラウザを開く簡単なアプリケーションを作成し、その方法を理解しましょう
- Androidスタジオで新しいFlutterアプリケーション_flutter_browser_app_を作成します
- main.dartコードを以下のコードに置き換えます-
- ここでは、ブラウザーを開いてそのonPressedメソッドをnullに設定する新しいボタンを作成しました。
- 今、次のパッケージをインポートします-
- ここで、services.dartには、プラットフォーム固有のコードを呼び出す機能が含まれています。
- MyHomePageウィジェットで新しいメッセージチャネルを作成します。
- プラットフォーム固有のメソッドである_openBrowserメソッド、メッセージチャネルを介したopenBrowserメソッドを呼び出すメソッドを記述します。
ここでは、platform.invokeMethodを使用してopenBrowserを呼び出しています(次の手順で説明します)。 openBrowserには、特定のURLを開くための引数urlがあります。
- RaisedButtonのonPressedプロパティの値をnullから_openBrowserに変更します。
- MainActivity.java(androidフォルダ内)を開き、必要なライブラリをインポートします-
- メソッドを作成し、ブラウザを開くopenBrowser
- 今、MainActivityクラスでチャンネル名を設定します-
- onCreateメソッドでメッセージ処理を設定するAndroid固有のコードを記述します-
ここでは、MethodChannelクラスを使用してメッセージチャネルを作成し、MethodCallHandlerクラスを使用してメッセージを処理しました。 onMethodCallは、メッセージを確認することで正しいプラットフォーム固有のコードを呼び出す実際のメソッドです。 onMethodCallメソッドは、メッセージからURLを抽出し、メソッド呼び出しがopenBrowserの場合にのみopenBrowserを呼び出します。 それ以外の場合、notImplementedメソッドを返します。
アプリケーションの完全なソースコードは次のとおりです-
アプリケーションを実行し、「ブラウザーを開く」ボタンをクリックすると、ブラウザーが起動していることがわかります。 ブラウザアプリ-ホームページは、ここのスクリーンショットに示すとおりです-
Flutter-IOS固有のコードの記述
iOS固有のコードへのアクセスは、iOS固有の言語(Objective-CまたはSwiftとiOS SDK)を使用することを除いて、Androidプラットフォームのコードに似ています。 それ以外の場合、概念はAndroidプラットフォームの概念と同じです。
iOSプラットフォームについても、前の章と同じアプリケーションを作成してみましょう。
- Android Studio(macOS)で新しいアプリケーション_flutter_browser_ios_app_を作成しましょう
- 前の章のように、手順2〜6に従います。
- XCodeを起動し、[ファイル]→[開く]をクリックします*
- flutterプロジェクトのiosディレクトリの下にあるxcodeプロジェクトを選択します。
- *ランナー→ランナーパス*でAppDelegate.mを開きます。 次のコードが含まれています-
- didFinishLaunchingWithOptionsメソッドで、コントローラーを見つけてコントローラー変数に設定します。
- didFinishLaunchingWithOptionsメソッドで、ブラウザチャネルをflutterapp.finddevguides.com/browseに設定します-
- 変数、weakSelfを作成し、現在のクラスを設定します-
- 次に、setMethodCallHandlerを実装します。 call.methodに一致させてopenBrowserを呼び出します。 call.argumentsを呼び出してURLを取得し、openBrowserの呼び出し中にそれを渡します。
- プロジェクト設定を開きます。
- *機能*に移動し、*バックグラウンドモード*を有効にします。
- バックグラウンドフェッチ*および*リモート通知*を追加します。
- 次に、アプリケーションを実行します。 Androidバージョンと同様に機能しますが、クロムではなくSafariブラウザーが開きます。
Flutter-パッケージの概要
Dartの一連の機能を整理および共有する方法は、パッケージを使用することです。 Dartパッケージは、単に共有可能なライブラリまたはモジュールです。 一般に、DartパッケージはDartアプリケーションと同じですが、Dartパッケージにはアプリケーションエントリポイントmainがありません。
パッケージの一般的な構造(デモパッケージmy_demo_packageを検討してください)は以下のとおりです-
- lib/src/ *-プライベートDartコードファイル。
- lib/my_demo_package.dart -メインDartコードファイル。 次のようにアプリケーションにインポートできます-
- 以下に示すように、必要に応じて、他のプライベートコードファイルをメインコードファイル(my_demo_package.dart)にエクスポートできます-
- lib/ *-任意のカスタムフォルダー構造に配置された任意の数のDartコードファイル。 コードには、次のようにアクセスできます。
- pubspec.yaml -アプリケーションと同じプロジェクト仕様、
パッケージ内のすべてのDartコードファイルは単にDartクラスであり、Dartコードをパッケージに含めるための特別な要件はありません。
パッケージの種類
Dartパッケージは基本的に同様の機能の小さなコレクションであるため、機能に基づいて分類できます。
ダーツパッケージ
Web環境とモバイル環境の両方で使用できる汎用Dartコード。 たとえば、english_wordsは約5000の単語を含むパッケージの1つで、名詞(英語の名詞をリストする)、音節(単語の音節の数を指定する)などの基本的なユーティリティ機能があります。
フラッターパッケージ
Flutterフレームワークに依存し、モバイル環境でのみ使用できる汎用Dartコード。 たとえば、fluroはフラッター用のカスタムルーターです。 Flutterフレームワークに依存します。
Flutterプラグイン
一般的なDartコード。Flutterフレームワークと、基盤となるプラットフォームコード(Android SDKまたはiOS SDK)に依存します。 たとえば、カメラはデバイスのカメラと対話するためのプラグインです。 Flutterフレームワークとカメラにアクセスするための基礎となるフレームワークに依存します。
Dartパッケージを使用する
Dartパッケージはホストされ、ライブサーバーhttps://pub.dev [[[3]]]に公開されます。また、Flutterは、アプリケーションでDartパッケージを管理するための単純なツールpubを提供します。 パッケージとして使用するために必要な手順は次のとおりです-
- 以下に示すように、pubspec.yamlに必要なパッケージ名とバージョンを含めます-
- 最新のバージョン番号は、オンラインサーバーを確認することで確認できます。
- 次のコマンドを使用して、アプリケーションにパッケージをインストールします-
- Androidスタジオでの開発中に、Android Studioはpubspec.yamlの変更を検出し、以下に示すように開発者にAndroidスタジオパッケージアラートを表示します-
- Dartパッケージは、メニューオプションを使用してAndroid Studioにインストールまたは更新できます。
- 以下に示すコマンドを使用して必要なファイルをインポートし、作業を開始します-
- パッケージで利用可能な任意の方法を使用し、
- ここでは、名詞関数を使用して上位50ワードを取得および印刷しました。
Flutterプラグインパッケージを開発する
Flutterプラグインの開発は、DartアプリケーションまたはDartパッケージの開発に似ています。 唯一の例外は、プラグインがシステムAPI(AndroidまたはiOS)を使用して、必要なプラットフォーム固有の機能を取得することです。
前の章でプラットフォームコードにアクセスする方法を既に学習したので、プラグイン開発プロセスを理解するために単純なプラグインmy_browserを開発しましょう。 my_browserプラグインの機能は、アプリケーションがプラットフォーム固有のブラウザーで特定のWebサイトを開くことを許可することです。
- Android Studioを起動します。
- [ファイル]→[新しいFlutterプロジェクト]をクリックし、[Flutterプラグイン]オプションを選択します。
- ここに示すように、Flutterプラグインの選択ウィンドウが表示されます-
- プロジェクト名としてmy_browserを入力し、[次へ]をクリックします。
- ここに示すように、ウィンドウにプラグイン名とその他の詳細を入力します-
- 下のウィンドウに会社のドメインflutterplugins.finddevguides.comを入力し、[*完了]をクリックします。 新しいプラグインを開発するためのスタートアップコードが生成されます。
- my_browser.dartファイルを開き、メソッドopenBrowserを記述して、プラットフォーム固有のopenBrowserメソッドを呼び出します。
- MyBrowserPlugin.javaファイルを開き、次のクラスをインポートします-
- ここでは、Androidからブラウザを開くために必要なライブラリをインポートする必要があります。
- MyBrowserPluginクラスにRegistrarタイプの新しいプライベート変数mRegistrarを追加します。
- ここでは、Registrarを使用して、呼び出し元コードのコンテキスト情報を取得します。
- MyBrowserPluginクラスにRegistrarを設定するコンストラクターを追加します。
- registerWithを変更して、MyBrowserPluginクラスに新しいコンストラクターを含めます。
- onBrowseCallメソッドを変更して、myBrowserPluginクラスにopenBrowserメソッドを含めます。
- プラットフォーム固有のopenBrowserメソッドを記述して、MyBrowserPluginクラスのブラウザーにアクセスします。
my_browserプラグインの完全なソースコードは次のとおりです-
- 新しいプロジェクト_my_browser_plugin_test_を作成して、新しく作成したプラグインをテストします。
- pubspec.yamlを開き、my_browserをプラグインの依存関係として設定します。
- Androidスタジオは、pubspec.yamlが以下のAndroidスタジオパッケージアラートに示されているように更新されたことを警告します-
- [依存関係の取得]オプションをクリックします。 Androidスタジオはインターネットからパッケージを取得し、アプリケーション用に適切に構成します。
- main.dartを開き、以下のようにmy_browserプラグインを含めます-
- 以下に示すように、my_browserプラグインからopenBrowser関数を呼び出します-
- main.dartの完全なコードは次のとおりです-
- アプリケーションを実行し、「ブラウザーを開く」ボタンをクリックして、ブラウザーが起動することを確認します。 あなたは、ブラウザアプリを見ることができます-以下に示すスクリーンショットに示すようにホームページ-
あなたは、ブラウザアプリを見ることができます-下に示すスクリーンショットに示されているブラウザ画面-
Flutter-REST APIへのアクセス
Flutterは、HTTPリソースを消費するhttpパッケージを提供します。 httpはFutureベースのライブラリであり、awaitおよびasync機能を使用します。 多くの高レベルのメソッドを提供し、RESTベースのモバイルアプリケーションの開発を簡素化します。
基本概念
httpパッケージは、Web要求を行うための高レベルのクラスとhttpを提供します。
- httpクラスは、すべてのタイプのHTTP要求を実行する機能を提供します。
- httpメソッドは、URL、およびDart Mapを介した追加情報(投稿データ、追加ヘッダーなど)を受け入れます。 サーバーを要求し、async/awaitパターンで応答を収集します。 たとえば、次のコードは、指定されたURLからデータを読み取り、コンソールに出力します。
コアメソッドのいくつかは次のとおりです-
- 読み取り-GETメソッドを使用して指定されたURLを要求し、Future <String>として応答を返します
- get -GETメソッドを使用して指定されたURLを要求し、Future <Response>として応答を返します。 応答は、応答情報を保持するクラスです。
- post -指定されたURLをPOSTメソッドで要求し、提供されたデータをポストして、Future <Response>として応答を返します。
- put -PUTメソッドを介して指定されたURLを要求し、Future <Response>として応答を返します
- head -HEADメソッドで指定されたURLを要求し、Future <Response>として応答を返します
- delete -DELETEメソッドを使用して指定されたURLを要求し、Future <Response>として応答を返します
httpは、より標準的なHTTPクライアントクラスであるclientも提供します。 クライアントは永続的な接続をサポートします。 特定のサーバーに対して大量の要求が行われる場合に役立ちます。 closeメソッドを使用して適切に閉じる必要があります。 それ以外の場合は、httpクラスに似ています。 サンプルコードは次のとおりです-
製品サービスAPIへのアクセス
Webサーバーから製品データを取得する単純なアプリケーションを作成し、_ListView_を使用して製品を表示します。
- Androidスタジオで_product_rest_app_に新しい_Flutter_アプリケーションを作成します。
- デフォルトの起動コード(main.dart)を_product_nav_app_コードに置き換えます。
- アセットフォルダーを_product_nav_app_から_product_rest_app_にコピーし、pubspec.yamlファイル内にアセットを追加します。
- 以下に示すように、pubspec.yamlファイルでhttpパッケージを構成します-
- ここでは、httpパッケージの最新バージョンを使用します。 Androidスタジオは、pubspec.yamlが更新されたことを示すパッケージアラートを送信します。
- [依存関係の取得]オプションをクリックします。 Androidスタジオはインターネットからパッケージを取得し、アプリケーション用に適切に構成します。
- main.dartファイルにhttpパッケージをインポートします-
- 以下に示すように、製品情報を持つ新しいJSONファイル、products.jsonを作成します-
新しいフォルダーJSONWebServerを作成し、JSONファイルproducts.jsonを配置します。
JSONWebServerをルートディレクトリとしてWebサーバーを実行し、Webパスを取得します。 たとえば、http://192.168.184.1:8000/products.json。 apache、nginxなどの任意のWebサーバーを使用できます。
最も簡単な方法は、ノードベースのhttpサーバーアプリケーションをインストールすることです。 http-serverアプリケーションをインストールして実行するには、以下の手順に従ってください
- Nodejsアプリケーションをインストールします(https://nodejs.org/en/[nodejs.org])
- JSONWebServerフォルダーに移動します。
- npmを使用してhttp-serverパッケージをインストールします。
- 次に、サーバーを実行します。
- libフォルダーに新しいファイルProduct.dartを作成し、Productクラスをその中に移動します。
- ProductクラスのファクトリコンストラクタProduct.fromMapを記述して、マップされたデータMapをProductオブジェクトに変換します。 通常、JSONファイルはDart Mapオブジェクトに変換されてから、関連するオブジェクト(製品)に変換されます。
- Product.dartの完全なコードは次のとおりです-
- メインクラスに2つのメソッドparseProductsとfetchProductsを記述して、WebサーバーからList <Product>オブジェクトに製品情報をフェッチしてロードします。
ここで次の点に注意してください-
- Futureは、製品情報を遅延ロードするために使用されます。 遅延読み込みは、必要になるまでコードの実行を延期する概念です。
- http.getは、インターネットからデータを取得するために使用されます。
- json.decodeは、JSONデータをDart Mapオブジェクトにデコードするために使用されます。 JSONデータがデコードされると、ProductクラスのfromMapを使用してList <Product>に変換されます。
- MyAppクラスで、新しいメンバー変数、タイプFuture <Product>の製品を追加し、コンストラクターに含めます。
- MyHomePageクラスで、Future <Product>型の新しいメンバー変数製品を追加し、コンストラクターに含めます。 また、items変数とその関連メソッドであるgetProductsメソッド呼び出しを削除します。 製品変数をコンストラクターに配置します。 アプリケーションを最初に起動したときに一度だけインターネットから製品を取得できます。
- 上記の変更に対応するために、MyAppウィジェットのビルドメソッドでホームオプション(MyHomePage)を変更します-
- Future <Product>引数を含むようにメイン関数を変更します-
- 新しいウィジェットProductBoxListを作成して、ホームページに製品リストを作成します。
List <Product>タイプの製品(オブジェクト)を渡すことで個別のウィジェットとして設計されていることを除いて、ナビゲーションアプリケーションで使用されているものと同じ概念を使用して製品をリストしていることに注意してください。
- 最後に、_MyHomePage_ウィジェットのビルドメソッドを変更して、通常のメソッド呼び出しの代わりにFutureオプションを使用して製品情報を取得します。
- ここでは、FutureBuilderウィジェットを使用してウィジェットをレンダリングしたことに注意してください。 FutureBuilderは、Future <List <Product >>型のfutureプロパティからデータを取得しようとします。 futureプロパティがデータを返す場合、ProductBoxListを使用してウィジェットをレンダリングします。そうでない場合はエラーをスローします。
- main.dartの完全なコードは次のとおりです-
最後に、アプリケーションを実行して結果を確認します。 アプリケーションのコーディング中に入力されたローカルの静的データではなく、インターネットからのデータであること以外は、_Navigation_の例と同じです。
Flutter-データベースの概念
Flutterは、データベースを操作するための多くの高度なパッケージを提供します。 最も重要なパッケージは-
- sqflite -SQLiteデータベースへのアクセスと操作に使用されます。
- firebase_database -Googleからクラウドホスト型NoSQLデータベースにアクセスして操作するために使用されます。
この章では、それぞれについて詳しく説明します。
SQLite
SQLiteデータベースは、事実上の標準のSQLベースの組み込みデータベースエンジンです。 小規模で実績のあるデータベースエンジンです。 sqfliteパッケージは、SQLiteデータベースを効率的に使用するための多くの機能を提供します。 SQLiteデータベースエンジンを操作する標準的な方法を提供します。 sqfliteパッケージによって提供されるコア機能は次のとおりです-
- SQLiteデータベースを作成/開く(openDatabaseメソッド)。
- SQLiteデータベースに対してSQLステートメント(実行メソッド)を実行します。
- SQLiteデータベースから情報を照会および取得するために必要なコードを削減するための高度な照会メソッド(照会メソッド)。
sqfliteパッケージを使用して標準SQLiteデータベースエンジンから製品情報を保存および取得する製品アプリケーションを作成し、SQLiteデータベースおよびsqfliteパッケージの背後にある概念を理解しましょう。
- Androidスタジオでproduct_sqlite_appに新しいFlutterアプリケーションを作成します。
- デフォルトの起動コード(main.dart)を_product_rest_app_コードに置き換えます。
- アセットフォルダーを_product_nav_app_から_product_rest_app_にコピーし、* pubspec.yaml`ファイル内にアセットを追加します。
- 以下に示すようにpubspec.yamlファイルでsqfliteパッケージを構成します-
sqfliteの最新バージョン番号を代わりに使用します
- 以下に示すように、pubspec.yamlファイルでpath_providerパッケージを構成します-
- ここでは、path_providerパッケージを使用して、システムの一時フォルダーパスとアプリケーションのパスを取得します。 _any_の代わりに_sqflite_の最新バージョン番号を使用します。
- Androidスタジオは、pubspec.yamlが更新されたことを警告します。
- [依存関係の取得]オプションをクリックします。 Androidスタジオはインターネットからパッケージを取得し、アプリケーション用に適切に構成します。
- データベースでは、名前、価格などの製品プロパティとともに主キー、IDが追加フィールドとして必要なので、Productクラスにidプロパティを追加します。 また、新しいメソッドtoMapを追加して、製品オブジェクトをMapオブジェクトに変換します。 fromMapとtoMapは、Productオブジェクトのシリアル化と非シリアル化に使用され、データベース操作メソッドで使用されます。
- libフォルダーに新しいファイルDatabase.dartを作成して、_SQLite_関連機能を記述します。
- Database.dartに必要なインポートステートメントをインポートします。
- ここで次の点に注意してください-
- async は非同期メソッドを記述するために使用されます。
- io はファイルとディレクトリへのアクセスに使用されます。
- path は、ファイルパスに関連するdartコアユーティリティ関数にアクセスするために使用されます。
- path_provider は、一時パスとアプリケーションパスを取得するために使用されます。
- sqflite は、SQLiteデータベースを操作するために使用されます。
- 新しいクラス SQLiteDbProvider を作成します
- 以下に指定されているように、シングルトンベースの静的SQLiteDbProviderオブジェクトを宣言します-
- SQLiteDBProvoiderオブジェクトとそのメソッドは、静的db変数を介してアクセスできます。
- タイプFuture <Database>のデータベース(Futureオプション)を取得するメソッドを作成します。 データベース自体の作成中に製品テーブルを作成し、初期データをロードします。
ここでは、次の方法を使用しました-
- getApplicationDocumentsDirectory -アプリケーションディレクトリパスを返します
- join -システム固有のパスを作成するために使用されます。 データベースパスの作成に使用しました。
- openDatabase -SQLiteデータベースを開くために使用
- onOpen -データベースを開くときにコードを書くために使用
- onCreate -データベースの初回作成時にコードを記述するために使用
- db.execute -SQLクエリの実行に使用されます。 クエリを受け入れます。 クエリにプレースホルダー(?)がある場合、2番目の引数のリストとして値を受け入れます。
データベース内のすべての製品を取得するメソッドを記述します-
ここでは、次のことを行いました-
クエリメソッドを使用して、すべての製品情報を取得します。 queryは、クエリ全体を記述せずにテーブル情報をクエリするショートカットを提供します。 queryメソッドは、columns、orderByなどの入力を使用して適切なクエリ自体を生成します。
ProductのfromMapメソッドを使用して、テーブル内のすべての行を保持する結果オブジェクトをループすることにより、製品の詳細を取得しました。
- ここでは、whereおよびwhereArgsを使用してフィルターを適用しました。
- データベースから製品を挿入、更新、削除する3つのメソッド-insert、update、deleteメソッドを作成します。
- Database.dartの最終的なコードは次のとおりです-
- mainメソッドを変更して、製品情報を取得します。
- ここでは、getAllProductsメソッドを使用して、データベースからすべての製品をフェッチしました。
- アプリケーションを実行し、結果を確認します。 製品情報が保存され、ローカルSQLiteデータベースから取得されることを除いて、前の例_Accessing Product service API_に似ています。
クラウドファイヤーストア
FirebaseはBaaSアプリ開発プラットフォームです。 認証サービス、クラウドストレージなどのモバイルアプリケーション開発を高速化する多くの機能を提供します。Firebaseの主な機能の1つは、クラウドベースのリアルタイムNoSQLデータベースであるCloud Firestoreです。
Flutterは、Cloud Firestoreでプログラムするための特別なパッケージcloud_firestoreを提供します。 Cloud Firestoreでオンライン製品ストアを作成し、製品ストアにアクセスするためのアプリケーションを作成しましょう。
- Androidスタジオでproduct_firebase_appに新しいFlutterアプリケーションを作成します。
- デフォルトの起動コード(main.dart)を_product_rest_app_コードに置き換えます。
- Product.dartファイルをproduct_rest_appからlibフォルダーにコピーします。
- アセットフォルダーをproduct_rest_appからproduct_firebase_appにコピーし、pubspec.yamlファイル内にアセットを追加します。
- 以下に示すように、pubspec.yamlファイルでcloud_firestoreパッケージを構成します-
- ここでは、cloud_firestoreパッケージの最新バージョンを使用します。
- Androidスタジオは、pubspec.yamlがここに示すように更新されたことを警告します-
[依存関係の取得]オプションをクリックします。 Androidスタジオはインターネットからパッケージを取得し、アプリケーション用に適切に構成します。
次の手順を使用してFirebaseでプロジェクトを作成します-
- https://firebase.google.com/pricing/。で無料プランを選択して、Firebaseアカウントを作成します。
- Firebaseアカウントが作成されると、プロジェクト概要ページにリダイレクトされます。 Firebaseベースのプロジェクトをすべてリストし、新しいプロジェクトを作成するオプションを提供します。
- [プロジェクトの追加]をクリックすると、プロジェクト作成ページが開きます。
- 製品名としてプロジェクト名を入力し、[プロジェクトの作成]オプションをクリックします。
- * Firebaseコンソールに移動します。
- [プロジェクトの概要]をクリックします。 プロジェクトの概要ページが開きます。
- Androidアイコンをクリックします。 Android開発に固有のプロジェクト設定が開きます。
- Androidパッケージ名com.finddevguides.flutterapp.product_firebase_appを入力します。
- アプリの登録をクリックします。 プロジェクト構成ファイルgoogle_service.jsonを生成します。
- google_service.jsonをダウンロードして、プロジェクトのandroid/appディレクトリに移動します。 このファイルは、アプリケーションとFirebase間の接続です。
- android/app/build.gradleを開き、次のコードを含めます-
- android/build.gradleを開き、次の構成を含めます-
ここでは、プラグインとクラスパスはgoogle_service.jsonファイルを読み取る目的で使用されます。
- android/app/build.gradleを開き、次のコードも含めます。
この依存関係により、Androidアプリケーションは複数のdex機能を使用できます。
- Firebase Consoleの残りの手順に従うか、単にスキップします。
次の手順を使用して、新しく作成されたプロジェクトに製品ストアを作成します-
- Firebaseコンソールに移動します。
- 新しく作成したプロジェクトを開きます。
- 左側のメニューで[データベース]オプションをクリックします。
- [データベースオプションの作成]をクリックします。
- [テストモードで開始]をクリックし、[有効にする]をクリックします。
- [コレクションを追加]をクリックします。 コレクション名として製品を入力し、[次へ]をクリックします。
- ここに画像に示すようにサンプル製品情報を入力してください-
- [ドキュメントの追加]オプションを使用して、追加の製品情報を追加します。
- main.dartファイルを開き、Cloud Firestoreプラグインファイルをインポートして、httpパッケージを削除します。
- parseProductsを削除し、fetchProductsを更新して、製品サービスAPIではなくCloud Firestoreから製品を取得します。
- ここでは、Firestore.instance.collectionメソッドを使用して、クラウドストアで利用可能な製品コレクションにアクセスします。 Firestore.instance.collectionには、コレクションをフィルタリングして必要なドキュメントを取得するための多くのオプションが用意されています。 ただし、すべての製品情報を取得するためのフィルターは適用していません。
- Cloud FirestoreはDart Streamコンセプトを通じてコレクションを提供するため、MyAppおよびMyHomePageウィジェットの製品タイプをFuture <list <Product >>からStream <QuerySnapshot>に変更します。
- MyHomePageウィジェットのビルドメソッドを変更して、FutureBuilderではなくStreamBuilderを使用します。
- ここでは、List <DocumentSnapshot>タイプとして製品情報を取得しました。 ウィジェットのProductBoxListはドキュメントと互換性がないため、ドキュメントをList <Product>タイプに変換し、さらに使用しました。
- 最後に、アプリケーションを実行して結果を確認します。 _SQLite application_と同じ製品情報を使用し、記憶媒体のみを変更したため、結果のアプリケーションは_SQLite application_アプリケーションと同一に見えます。
Flutter-国際化
現在、モバイルアプリケーションはさまざまな国のお客様によって使用されており、その結果、アプリケーションはさまざまな言語でコンテンツを表示する必要があります。 アプリケーションを複数の言語で動作させることを、アプリケーションの国際化と呼びます。
アプリケーションが異なる言語で動作するためには、まずアプリケーションが実行されているシステムの現在のロケールを見つけてから、その特定のロケールでコンテンツを表示する必要があります。このプロセスはローカリゼーションと呼ばれます。
Flutterフレームワークは、ローカライズ用の3つの基本クラスと、アプリケーションをローカライズするための基本クラスから派生した広範なユーティリティクラスを提供します。
基本クラスは次のとおりです-
- Locale-ロケールは、ユーザーの言語を識別するために使用されるクラスです。 たとえば、en-usはアメリカ英語を識別し、次のように作成できます。
ここで、最初の引数は言語コードであり、2番目の引数は国コードです。 _Argentinaスペイン語(es-ar)_ロケールを作成する別の例は次のとおりです-
- Localizations-Localizationsは、Localeとその子のローカライズされたリソースを設定するために使用される一般的なウィジェットです。
ここで、CustomLocalizationsは、ウィジェットの特定のローカライズされたコンテンツ(タイトルとメッセージ)を取得するために特別に作成された新しいカスタムクラスです。 ofメソッドは、Localizationsクラスを使用して新しいCustomLocalizationsクラスを返します。
LocalizationsDelegate <T>-LocalizationsDelegate <T>は、Localizationsウィジェットがロードされるファクトリクラスです。 それは3つのオーバーライド可能なメソッドを持っています-
- isSupported-ロケールを受け入れ、指定されたロケールがサポートされているかどうかを返します。
- load-ロケールを受け入れ、指定されたロケールのリソースのロードを開始します。
- shouldReload-Localizationsウィジェットの再構築時にCustomLocalizationsの再読み込みが必要かどうかを指定します。
- CustomLocalizationDelegateの完全なコードは次のとおりです-
一般的に、Flutterアプリケーションは2つのルートレベルウィジェット、MaterialAppまたはWidgetsAppに基づいています。 Flutterは、両方のウィジェットに既製のローカライズを提供し、それらはMaterialLocalizationsとWidgetsLocaliationsです。 さらに、FlutterはMaterialLocalizationsとWidgetsLocaliationsをロードするデリゲートも提供します。これらはそれぞれGlobalMaterialLocalizations.delegateとGlobalWidgetsLocalizations.delegateです。
概念をテストして理解するために、簡単な国際化対応アプリケーションを作成しましょう。
- 新しいflutterアプリケーションflutter_localization_appを作成します。
- Flutterは、専用flutterパッケージflutter_localizationsを使用した国際化をサポートしています。 ローカライズされたコンテンツをメインSDKから分離するという考え方です。 pubspec.yamlを開き、以下のコードを追加して国際化パッケージを有効にします-
- Androidスタジオは、pubspec.yamlが更新されたことを示す次のアラートを表示します。
- [依存関係の取得]オプションをクリックします。 Androidスタジオはインターネットからパッケージを取得し、アプリケーション用に適切に構成します。
- 次のようにmain.dartにflutter_localizationsパッケージをインポートします-
- ここで、SynchronousFutureの目的は、カスタムローカリゼーションを同期的にロードすることです。
- 以下に指定されているように、カスタムローカリゼーションとそれに対応するデリゲートを作成します-
- ここでは、アプリケーションのタイトルとメッセージのローカライズをサポートするためにCustomLocalizationsが作成され、CustomLocalizationsをロードするためにCustomLocalizationsDelegateが使用されます。
- MaterialAppプロパティ、localizationsDelegates、supportedLocalesを使用して、下で指定されているように、MaterialApp、WidgetsApp、およびCustomLocalizationのデリゲートを追加します-
- CustomLocalizationsメソッドを使用して、ローカライズされたタイトルとメッセージの値を取得し、以下に指定されている適切な場所で使用します-
- ここでは、簡単にするためにMyHomePageクラスをStatefulWidgetからStatelessWidgetに変更し、CustomLocalizationsを使用してタイトルとメッセージを取得しました。
- アプリケーションをコンパイルして実行します。 アプリケーションは、コンテンツを英語で表示します。 アプリケーションを閉じます。 設定→システム→言語と入力→言語**に移動します。
- [言語の追加]オプションをクリックして、スペイン語を選択します。 これにより、スペイン語がインストールされ、オプションの1つとしてリストされます。
- スペイン語を選択し、英語の上に移動します。 これは、第一言語としてスペイン語に設定され、すべてがスペイン語のテキストに変更されます。
- 国際化アプリケーションを再起動すると、タイトルとメッセージがスペイン語で表示されます。
- 設定で英語オプションをスペイン語オプションの上に移動することにより、言語を英語に戻すことができます。
- アプリケーションの結果(スペイン語)は、以下のスクリーンショットに示されています-
intlパッケージの使用
Flutterは、ローカライズされたモバイルアプリケーションの開発をさらに簡素化するintlパッケージを提供します。 intlパッケージは、言語固有のメッセージを半自動生成するための特別なメソッドとツールを提供します。
intlパッケージを使用して新しいローカライズアプリケーションを作成し、概念を理解しましょう。
- 新しいflutterアプリケーションflutter_intl_appを作成します。
- pubspec.yamlを開き、パッケージの詳細を追加します。
- Androidスタジオは、pubspec.yamlが更新されたことを通知する以下のアラートを表示します。
- [依存関係の取得]オプションをクリックします。 Androidスタジオはインターネットからパッケージを取得し、アプリケーション用に適切に構成します。
- 前のサンプルflutter_internationalization_appからmain.dartをコピーします。
- 以下に示すように、国際パッケージをインポートします-
- 以下に示すコードに示すように、CustomLocalizationクラスを更新します-
ここでは、カスタムメソッドの代わりにintlパッケージの3つのメソッドを使用しました。 それ以外は、概念は同じです。
Intl.canonicalizedLocale-正しいロケール名を取得するために使用されます。
Intl.defaultLocale-現在のロケールを設定するために使用
Intl.message-新しいメッセージを定義するために使用されます。
- 次に、フォルダーlib/l10nを作成します
- コマンドプロンプトを開き、アプリケーションのルートディレクトリ(pubspec.yamlが利用可能)に移動し、次のコマンドを実行します-
- ここで、コマンドは、異なるロケールでメッセージを作成するためのテンプレートintl_message.arbファイルを生成します。 ファイルの内容は次のとおりです-
- intl_message.arbをコピーして、新しいファイルintl_en.arbを作成します。
- intl_message.arbをコピーし、新しいファイルintl_es.arbを作成して、以下に示すようにコンテンツをスペイン語に変更します-
- 次に、次のコマンドを実行して、最終的なメッセージファイルmessages_all.dartを作成します。
- アプリケーションをコンパイルして実行します。 上記のアプリケーションflutter_localization_appと同様に機能します。
フラッター-テスト
テストは、アプリケーションの開発ライフサイクルにおける非常に重要なフェーズです。 アプリケーションが高品質であることを保証します。 テストには、慎重な計画と実行が必要です。 また、開発の最も時間のかかるフェーズです。
Dart言語とFlutterフレームワークは、アプリケーションの自動テストの広範なサポートを提供します。
テストの種類
一般に、アプリケーションを完全にテストするには、3種類のテストプロセスを使用できます。 彼らは次のとおりです-
単体テスト
単体テストは、アプリケーションをテストする最も簡単な方法です。 クラスのメソッドのコード(一般的には関数)の正確さを保証することに基づいています。 しかし、それは実際の環境を反映していないため、バグを見つけるための最小のオプションです。
ウィジェットのテスト
ウィジェットのテストは、ウィジェットの作成、レンダリング、および他のウィジェットとの対話が期待どおりであることを確認することに基づいています。 さらに一歩進んで、ほぼリアルタイムの環境を提供して、より多くのバグを見つけます。
統合テスト
統合テストには、データベース、Webサービスなどのアプリケーションの外部コンポーネントとともに、単体テストとウィジェットテストの両方が含まれます。実際の環境をシミュレートまたはモックして、ほぼすべてのバグを検出しますが、最も複雑なプロセスです。
Flutterは、あらゆる種類のテストをサポートします。 ウィジェットのテストを広範囲かつ排他的にサポートします。 この章では、ウィジェットのテストについて詳しく説明します。
ウィジェットのテスト
Flutterテストフレームワークは、ウィジェットをテストするtestWidgetsメソッドを提供します。 それは2つの引数を受け入れます-
- テストの説明
- テストコード
関与するステップ
ウィジェットのテストには、3つの異なるステップが含まれます-
- テスト環境でウィジェットをレンダリングします。
- WidgetTesterは、Flutterテストフレームワークによって提供される、ウィジェットを構築してレンダリングするクラスです。 WidgetTesterクラスのpumpWidgetメソッドは、任意のウィジェットを受け入れ、テスト環境でレンダリングします。
テストする必要があるウィジェットを見つけます。
Flutterフレームワークは、テスト環境でレンダリングされたウィジェットを見つけるための多くのオプションを提供し、それらは一般にファインダーと呼ばれます。 最も頻繁に使用されるファインダーは、find.text、find.byKey、find.byWidgetです。
- find.textは、指定されたテキストを含むウィジェットを検索します。
- find.byKeyは、特定のキーでウィジェットを検索します。
- find.byWidgetは、インスタンス変数でウィジェットを見つけます。
ウィジェットが期待どおりに機能することを確認します。
Flutterフレームワークには、ウィジェットを期待されるウィジェットと一致させるための多くのオプションがあり、通常は_Matchers_と呼ばれます。 テストフレームワークが提供するexpectメソッドを使用してウィジェットを一致させることができます。これは、2番目のステップで、マッチャーのいずれかを選択することで、期待されるウィジェットと一致します。 重要なマッチャーの一部は次のとおりです。
- findsOneWidget-単一のウィジェットが見つかったことを確認します。
- findsNothing-ウィジェットが見つからないことを確認します
- findsWidgets-単一のウィジェットが見つかったことを確認します。
- findsNWidgets-N個のウィジェットが見つかったことを確認します。
完全なテストコードは次のとおりです-
ここでは、本文にTextウィジェットを使用して、テキストHelloを使用してMaterialAppウィジェットをレンダリングしました。 次に、find.textを使用してウィジェットを検索し、findsOneWidgetを使用して一致させました。
実施例
単純なフラッターアプリケーションを作成し、ウィジェットテストを作成して、関連する手順と概念をよりよく理解しましょう。
- Androidスタジオで新しいflutterアプリケーションflutter_test_appを作成します。
- テストフォルダーでwidget_test.dartを開きます。 以下に示すサンプルのテストコードがあります-
ここでは、テストコードは次の機能を実行します-
- tester.pumpWidgetを使用してMyAppウィジェットをレンダリングします。
- findsOneWidgetおよびfindsNothingマッチャーを使用して、カウンターが最初にゼロになるようにします。
- find.byIconメソッドを使用して、カウンターインクリメントボタンを検索します。
- tester.tapメソッドを使用して、カウンターインクリメントボタンをタップします。
- findsOneWidgetおよびfindsNothingマッチャーを使用して、カウンターが増加するようにします。
カウンターのインクリメントボタンをもう一度タップして、カウンターが2に増えたかどうかを確認します。
- [実行]メニューをクリックします。
- widget_test.dartオプションのテストをクリックします。 これにより、テストが実行され、結果ウィンドウに結果が報告されます。
フラッター-展開
この章では、AndroidプラットフォームとiOSプラットフォームの両方でFlutterアプリケーションを展開する方法について説明します。
Androidアプリケーション
- Androidマニフェストファイルのandroid:labelエントリを使用して、アプリケーション名を変更します。 AndroidアプリマニフェストファイルであるAndroidManifest.xmlは、<app dir>/android/app/src/mainにあります。 これには、Androidアプリケーションに関する詳細がすべて含まれています。 android:labelエントリを使用してアプリケーション名を設定できます。
- マニフェストファイルのandroid:iconエントリを使用してランチャーアイコンを変更します。
- 必要に応じて、標準オプションを使用してアプリに署名します。
- 必要に応じて、標準オプションを使用してプロガードと難読化を有効にします。
- 以下のコマンドを実行してリリースAPKファイルを作成します-
- 次のように出力を見ることができます-
- 次のコマンドを使用してデバイスにAPKをインストールします-
- アプリバンドルを作成してアプリケーションをGoogle Playstoreに公開し、標準の方法を使用してPlaystoreにプッシュします。
iOSアプリケーション
- 標準的な方法を使用して、_App Store Connect_にiOSアプリケーションを登録します。 アプリケーションの登録中に使用した = Bundle ID を保存します。
- XCodeプロジェクト設定の表示名を更新して、アプリケーション名を設定します。
- XCodeプロジェクト設定のバンドルIDを更新して、ステップ1で使用したバンドルIDを設定します。
- 標準的な方法を使用して、必要に応じて符号をコーディングします。
- 標準的な方法を使用して、必要に応じて新しいアプリアイコンを追加します。
- 次のコマンドを使用してIPAファイルを生成します-
- 今、あなたは次の出力を見ることができます-
- 標準の方法を使用して、アプリケーション、IPAファイルをTestFlightにプッシュすることにより、アプリケーションをテストします。
- 最後に、標準の方法を使用して、アプリケーションを_App Store_にプッシュします。
Flutter-開発ツール
この章では、Flutter開発ツールについて詳しく説明します。 クロスプラットフォーム開発ツールキットの最初の安定版リリースは、2018年12月4日にリリースされたFlutter 1.0です。 Googleはさまざまな開発ツールを使用してFlutterフレームワークの改善と強化を継続的に行っています。
ウィジェットセット
Googleは、素材およびクパチーノウィジェットセット用に更新し、コンポーネント設計でピクセル単位の完璧な品質を提供します。 flutter 1.2の次期バージョンは、デスクトップキーボードイベントとマウスホバーサポートをサポートするように設計されます。
Visual Studio Codeを使用したフラッター開発
Visual Studio Codeはフラッター開発をサポートし、迅速かつ効率的な開発のための広範なショートカットを提供します。 フラッター開発のためにVisual Studio Codeが提供する主要な機能の一部を以下に示します-
- コードアシスト-オプションを確認したい場合、 Ctrl + Space を使用してコード補完オプションのリストを取得できます。
- クイックフィックス- Ctrl + 。 コードの修正に役立つクイック修正ツールです。
- コーディング中のショートカット。
- コメントで詳細なドキュメントを提供します。
- デバッグのショートカット。
- ホットリスタート。
Dart DevTools
Android StudioまたはVisual Studio Code、または他のIDEを使用してコードを記述し、プラグインをインストールできます。 Googleの開発チームは、Dart DevToolsと呼ばれるさらに別の開発ツールに取り組んでいます。これはWebベースのプログラミングスイートです。 AndroidプラットフォームとiOSプラットフォームの両方をサポートしています。 タイムラインビューに基づいているため、開発者はアプリケーションを簡単に分析できます。
DevToolsをインストールする
DevToolsをインストールするには、コンソールで次のコマンドを実行します-
今、あなたは次の出力を見ることができます-
サーバーを実行
次のコマンドを使用して、DevToolsサーバーを実行できます-
これで、次のような応答が得られます。
アプリケーションを開始する
アプリケーションに移動し、シミュレータを開き、次のコマンドを使用して実行します-
これで、DevToolsに接続されました。
ブラウザでDevToolsを起動します
次に、ブラウザで以下のURLにアクセスして、DevToolsを起動します-
あなたは以下に示すように応答を取得します-
Flutter SDK
Flutter SDKを更新するには、次のコマンドを使用します-
次のように出力を見ることができます-
Flutterパッケージをアップグレードするには、次のコマンドを使用します-
次の応答が表示されます。
フラッターインスペクター
フラッターウィジェットツリーを探索するために使用されます。 これを実現するには、コンソールで次のコマンドを実行し、
次のように出力を見ることができます-
今、URL、http://127.0.0.1:50399/に移動すると、次の結果が表示されます-
Flutter-高度なアプリケーションの作成
この章では、本格的なモバイルアプリケーション、expense_calculatorの作成方法を学習します。 Expense_Calculatorの目的は、経費情報を保存することです。 アプリケーションの完全な機能は次のとおりです-
- 費用リスト。
- 新しい費用を入力するフォーム。
- 既存の費用を編集/削除するオプション。
- 任意のインスタンスでの総費用。
Flutterフレームワークの下記の高度な機能を使用して、expense_calculatorアプリケーションをプログラミングします。
経費リストを表示するためのListViewの高度な使用。
フォームプログラミング。
経費を保存するSQLiteデータベースプログラミング。
プログラミングを簡素化するscoped_model状態管理。
Androidスタジオで新しいFlutterアプリケーション、expense_calculatorを作成します。
pubspec.yamlを開き、パッケージの依存関係を追加します。
ここでこれらのポイントを観察します-
- sqfliteは、SQLiteデータベースプログラミングに使用されます。
- path_providerは、システム固有のアプリケーションパスを取得するために使用されます。
- scoped_modelは状態管理に使用されます。
- intlは日付のフォーマットに使用されます。
Androidスタジオは、pubspec.yamlが更新されたことを示す次のアラートを表示します。
[依存関係の取得]オプションをクリックします。 Androidスタジオはインターネットからパッケージを取得し、アプリケーション用に適切に構成します。
main.dartの既存のコードを削除します。
新しいファイルExpense.dartを追加して、Expenseクラスを作成します。 経費クラスには、以下のプロパティとメソッドがあります。
- property:id -SQLiteデータベースの経費エントリを表す一意のID。
- property:amount -費やされた金額。
- property:date -金額が費やされた日付。
- プロパティ:カテゴリ-カテゴリは、金額が費やされる領域を表します。 例:食べ物、旅行など
- formattedDate -日付プロパティのフォーマットに使用
- fromMap -データベーステーブルのフィールドを経費オブジェクトのプロパティにマップし、新しい経費オブジェクトを作成するために使用します。
- toMap -経費オブジェクトをDart Mapに変換するために使用され、データベースプログラミングでさらに使用できます。
- columns -データベースフィールドを表すために使用される静的変数。
次のコードを入力してExpense.dartファイルに保存します。
上記のコードは単純で自明です。
新しいファイルDatabase.dartを追加して、SQLiteDbProviderクラスを作成します。 SQLiteDbProviderクラスの目的は次のとおりです-
- getAllExpensesメソッドを使用して、データベースで利用可能なすべての費用を取得します。 すべてのユーザーの費用情報をリストするために使用されます。
- getExpenseByIdメソッドを使用して、データベースで使用可能な経費IDに基づいて特定の経費情報を取得します。 特定の経費情報をユーザーに表示するために使用されます。
- getTotalExpenseメソッドを使用して、ユーザーの総費用を取得します。 現在の総費用をユーザーに示すために使用されます。
- insertメソッドを使用して、新しい経費情報をデータベースに追加します。 ユーザーが新しい経費エントリをアプリケーションに追加するために使用されます。
- 更新方法を使用して、既存の費用情報を更新します。 ユーザーがシステムで使用できる既存の経費エントリを編集および更新するために使用されます。
- deleteメソッドを使用して、既存の経費情報を削除します。 ユーザーがシステムで使用可能な既存の経費エントリを削除するために使用されます。
- SQLiteDbProviderクラスの完全なコードは次のとおりです-
ここに、
- データベースは、SQLiteDbProviderオブジェクトを取得するプロパティです。
- initDBは、SQLiteデータベースを選択して開くために使用されるメソッドです。
新しいファイルExpenseListModel.dartを作成して、ExpenseListModelを作成します。 モデルの目的は、ユーザーの費用の完全な情報をメモリに保持し、ユーザーの費用がメモリで変更されるたびにアプリケーションのユーザーインターフェイスを更新することです。 scoped_modelパッケージのModelクラスに基づいています。 次のプロパティとメソッドがあります-
- _items-費用のプライベートリスト。
- items-リストへの予期しないまたは偶発的な変更を防ぐためのUnmodifiableListView <Expense>としての_itemsのゲッター。
- totalExpense-アイテム変数に基づいた総費用のゲッター。
- load-経費をデータベースから_items変数にロードするために使用されます。 また、UIを更新するためにnotifyListenersを呼び出します。
- byId-_items変数から特定の費用を取得するために使用されます。
- add-新しい経費項目を_items変数とデータベースに追加するために使用します。 また、UIを更新するためにnotifyListenersを呼び出します。
- 更新-経費項目を_items変数およびデータベースに更新するために使用されます。 また、UIを更新するためにnotifyListenersを呼び出します。
- delete-データベースからだけでなく、_items変数内の既存の経費項目を削除するために使用されます。 また、UIを更新するためにnotifyListenersを呼び出します。
- ExpenseListModelクラスの完全なコードは次のとおりです-
- main.dartファイルを開きます。 以下に指定されているようにクラスをインポートします-
- メイン関数を追加し、ScopedModel <ExpenseListModel>ウィジェットを渡してrunAppを呼び出します。
ここに、
- 経費オブジェクトは、データベースからすべてのユーザー経費情報をロードします。 また、アプリケーションを初めて開いたときに、適切なテーブルを使用して必要なデータベースが作成されます。
- ScopedModelは、アプリケーションのライフサイクル全体で費用情報を提供し、どのインスタンスでもアプリケーションの状態を維持します。 これにより、StatefulWidgetの代わりにStatelessWidgetを使用できます。
MaterialAppウィジェットを使用して簡単なMyAppを作成します。
- MyHomePageウィジェットを作成して、すべてのユーザーの費用情報と合計費用を上部に表示します。 右下隅のフローティングボタンは、新しい費用を追加するために使用されます。
ここに、
- ScopedModelDescendantは、費用モデルをListViewおよびFloatingActionButtonウィジェットに渡すために使用されます。
- ListView.separatedおよびListTileウィジェットは、経費情報をリストするために使用されます。
- Dismissibleウィジェットは、スワイプジェスチャーを使用して経費エントリを削除するために使用されます。
- ナビゲータは、経費エントリの編集インターフェイスを開くために使用されます。 経費入力をタップすることで有効にできます。
FormPageウィジェットを作成します。 FormPageウィジェットの目的は、経費エントリを追加または更新することです。 経費入力の検証も処理します。
ここに、
- TextFormFieldは、フォームエントリの作成に使用されます。
- TextFormFieldのvalidatorプロパティは、RegExパターンとともにフォーム要素を検証するために使用されます。
- _submit関数は、経費オブジェクトとともに使用して、経費をデータベースに追加または更新します。
- main.dartファイルの完全なコードは次のとおりです-
- 次に、アプリケーションを実行します。
- フローティングボタンを使用して新しい費用を追加します。
- 経費入力をタップして、既存の経費を編集します。
- 経費エントリをいずれかの方向にスワイプして、既存の経費を削除します。
アプリケーションのスクリーンショットのいくつかは次のとおりです-
フラッター-結論
Flutterフレームワークは、真にプラットフォームに依存しない方法でモバイルアプリケーションを構築するための優れたフレームワークを提供することにより、素晴らしい仕事をします。 Flutterフレームワークは、開発プロセスのシンプルさ、結果のモバイルアプリケーションの高性能、AndroidプラットフォームとiOSプラットフォームの両方に対応するリッチで関連性の高いユーザーインターフェイスを提供することで、多くの新しい開発者が近い将来。