Closed13

Flutter & Dart Cookbookの読書メモ(第一章)

marbullmarbull

https://www.oreilly.com/library/view/flutter-and-dart/9781098119508/

Who Should Read This Book

FlutterとDartを学ぶことの素晴らしさは、参入障壁が非常に低いこと。

アプリケーションを開発するには、技術も努力も必要。

複数の言語の経験がある人も、ソフトウェア開発の経験がゼロの人も、FlutterとDartは魅力的なアプリを作るための素晴らしい出発点となる。

初日からすぐに生産性を高め、わずかな努力で美しいアプリケーションを生み出すことができる。

アプリの構築には、外部サービスとの連携だけでなく、多くの可動部品が必要。

Firebase スイートの基本を学び、クラウドを使った最初の一歩を踏み出す。

ゲーム作りを始め、Flame ゲームエンジンの構成要素を理解することができる。

marbullmarbull

Why I Wrote This Book

筆者が注目したのは、アプリの構築速度と見た目の美しさ。

すぐに生産性が向上したことが印象的で、シンプルなマルチプラットフォームアプリを作ることにすぐに夢中になった。

筆者がこの新しい技術を学び始めた頃、当たり前でないこと、覚えにくいことがたくさんあった。

この本は、そのコースに取り組んでいる間、筆者の横に置いておきたかったもの。

また、アプリ制作の旅を始めるにあたって、既存の知識を補完してくれる。

marbullmarbull

Navigating This Book

どんな言語でも、使い始めるとなると、何から手をつけていいのか、何が必要なのか、わからないことがたくさんある。

この本を隅から隅まで読んでほしいのですが、現実的にはFlutterの章に直接飛ぶことが多い。

そのため、本書では大まかなカテゴリを設け、必要に応じて主題に入り込むことができるようにしている。

大まかなカテゴリは以下の通り。

第1章と第2章では、Dart言語の紹介を行い、変数や制御フローなどの基本的を抑える。

第3章から第6章では、Dart言語の本質的な要素に素早く触れ、生産的に言語を使用することができるようする。

第7章から第14章では、Flutter言語と画面表示に関する基本を解説している。
widgetの作成やデータ管理が必要なアプリを開発する際に、最も参照するセクションである。

第15章と第16章では、クラウドでの作業、特に認証、データベース、ホスティングを追加するためのFirebaseについて説明する。

第17章では、ゲームエンジンFlameの使い方を説明する。

Appendixでは、Flutterフレームワークのインストール、Flutter Doctorの使用、IDEでの作業など、環境を整えるために必要な事柄を解説してる。

marbullmarbull

Chapter1

Learning Dart Variables

この章では、Dartにおける変数の基本を学ぶ。

Dartは豊富な変数データ型のセットを提供している。

他のプログラミング言語での変数の使い方に慣れていれば、Dart で変数を理解することはそれほど難しくはない。

この章は、より複雑なトピックに進む前に、理解を深めるための簡単なガイドとしての役割を果たす。

初心者のために、この章では基本的なことを紹介する。

最終的には、Dart/Flutterを学ぶ過程において、簡単な技術ガイドを提供することになる。

章を通じ、コード例は自己完結しており、典型的なユースケースに焦点をあてている。

まず、4つの主な変数型(int、double、bool、String)と、それぞれの使用方法について説明する。

最後に、変数に対して何をしたいのかを Dart に知らせる方法を学ぶ。(final、const、null など)

また、変数に関連付けられた値を変更することができる「immutable」についても取り上げる。

immutableとは、変更することができないこと。

Dartでは、constとfinalというキーワードで変数がimmutableになります。

immutableの重要な点は、コンパイル時にチェックされるか、実行時にチェックされるかである。

コンパイル時とは、コード構築の段階で適用されるチェックのこと。(const変数)
実行時とは、アプリケーションの実行段階で行われるチェックを指す。(final変数)

Dart 2.0では、一度変数を宣言すると、その型を変更することができない型安全な言語になっている。

例えば、double型の変数を宣言した場合、明示的にキャストしなければint型として使用することはできない。

marbullmarbull

1.1 Running a Dart Application

  • Problem
    dartアプリケーションを実行する

  • Solution
    Dartのコードは、SDKをインストールすると、その環境内で実行することができる。
    SDKのインストール方法については、「付録」を参照する。

ターミナルセッションを開き、コマンドを入力できるようにする。

IDEを使用している場合は、そのアプリケーションの中でターミナルを開く必要がある。
ここで、デバイスにDartがインストールされているかどうか、バージョンを確認する。

dart --version

コマンドが正常に応答した場合、インストールされたSDKのバージョンと実行中のプラットフォームが表示される。
コマンドが失敗した場合、お使いのデバイスのインストールとパスを確認する必要がある。

エディタでmain.dartというファイルを新規に作成し、以下の内容を追加する。

void main() {
  print('Hello, Dart World!');
}

以下のようにコマンドラインからサンプルコードを実行する。

dart main.dart

"Hello, Dart World!" と出力される。

  • Discussion
    dartコマンドは、Dart SDKのインストールの一部として利用可能。
    前述の例では、このコマンドはmain.dartという名前のファイルを実行する。
    Dartアプリケーションには.dartという拡張子があり、コマンドラインから、またはIDE(Android StudioやVS Codeなど)から実行することができる。
    注:Android StudioとVS Codeのいずれも、Dart/Flutterの機能を含むようにあらかじめ設定されているわけではない。
    コードを実行する前に、(SDKのインストールに加えて)関連するプラグインをインストールする必要がある。
    Dartを環境にインストールしたくない場合は、DartPad使用する。
    dart コマンドを実行できない場合は、おそらくSDKが正しくインストールされていない可能性がある。
    最新のインストール手順を使用して、お使いのデバイスへのインストールを確認する。
marbullmarbull

1.2 Working with integer Values

  • Problem
    小数点を含まない数値を格納したい。
  • Solution
    整数型の変数を使用して、小数点を除いた数値を格納する。
    整数値35を格納したい場合は、以下のように宣言する。
void main() {
  int myVariable = 35;

  print(myVariable); 
}

Dart言語では、整数はintというデータ型を使用する。
前述のコード例では、データ型(例:int)は宣言の最初の部分。
次に、使用するデータ型にラベルを割り当てる。(例:myVariable)
最後に、データ型に値を代入する。この例では、35 という値。

データ型を使用するために、例えばmyVariableのように変数が宣言されている。変数とは、作成されたデータ型を参照するためのラベルである。

変数が使用可能になると、データ型に値を割り当てることができるようになる。この例では、整数の35が変数myVariableに割り当てられている。そして、printステートメントを使用して、変数の値を出力していいる。

  • Discussion
    Dartでは、変数の宣言は決まったパターンに従っている。
    プレフィックスは使用するデータ型を宣言し、その後に変数ラベル、そしてオプションで代入を行う。
    この例では、使用するデータ型はint。整数は小数点を持たない数値で表される。
    intの典型的な使用例は、小数点以下が不要な数値(すなわち精度)。
    intは64ビットの整数値として定義される。
    整数データ型はnumのサブタイプで、+/-などの基本演算を含む。
    変数ラベルは、サンプルコードでintデータ型を参照するための手段を提供する。
    この例では、myVariable というラベルを使用している。
    変数に名前を付けるときは、その変数の目的に関連した名前にするようにする。
    変数の宣言が完了したら、値を代入します。つまり、この変数を参照したときに、int 型のデータ型として 35 という値が使われることを期待する。
    もし、整数型変数が初期化されていなければ、値にアクセスできないことになる。
    このような場合、Dartはアクセスしようとしている値がNULLでない変数であることを示すエラーを返す。
    つまり、アクセスしようとしている変数に値が割り当てられていないことを意味する。
    ほとんどの場合、これはエラーであり、Dartコンパイラーは私たちが間違いを犯したことを親切に教えてくれる。
    実際にNullableを使用したい場合は、この状況をどのように処理するかをDartに指示する必要がある。NULL値の処理については、レシピ1.9で詳しく説明する。
marbullmarbull

1.3 Working with Double values

  • Problem
    小数点を持つ数値を格納したい。
  • Solution
    小数点を含む数値を格納する場合は、double(precision)変数を使用する。
    2.99という値を格納したい場合は、次のように宣言する。
void main() {
  double myVariable = 2.99

  print(myVariable);
}

他の変数と同様に、変数の前にdoubleなどのデータ型を付ける。
その際、変数にはmyVariableのようなラベルを付ける必要がある。
最後に、データ型に値を代入する。この例では、2.99という値である。

  • Discussion
    先ほどの例では、まず使用するデータ型、つまりdoubleを宣言する。続いて、doubleの変数名(この例ではmyVariable)を宣言する。
    最後の部分、変数に値を代入する部分は任意。
    doubleデータ型の典型的な使用例としては、ある程度の精度が必要な数値が挙げられる。
    doubleデータ型は64ビット浮動小数点数である。doubleはnumのサブタイプであり、+/-などの基本的な演算を含む。
marbullmarbull

1.4 Working with Boolean Values

  • Problem
    真偽値を格納したい。

  • Solution
    bool 変数を使用して、真(true)/偽(false)の状態を保持する。
    キーワード bool を使ってブール変数を宣言し、データ型の宣言の後に変数名のラベルを付ける。
    最後に、この変数に true か false のどちらかの値を代入する。
    以下は、boolを宣言する例。

void main() {
  bool myVariable = true;

  print(myVariable);
}
  • Discussion
    先の例では、まず使用するデータ型、すなわちboolを宣言する。
    続いて、定義されたデータ型に対応する変数名を宣言する。
    最後の部分はオプションで、名前付き変数に値を代入している。
    boolの使用例は、true/falseのシナリオである。
    Dartでは、trueとfalseは予約語である。
    booleanデータ型には、論理演算、例えば、and、equality、inclusive or、exclusive orがあります。
marbullmarbull

1.5 Working with Strings

  • Problem
    文字列を格納したい。
  • Solution
    文字列のシーケンスを格納するために、String変数を使用する。
    以下は、Stringの宣言の仕方についての例。
void main() {
  String myVariable = "I am a string";

  String myVariable2 = """
      I am a multiline
      string
      """;

  print(myVariable)
}
  • Discussion
    使用するデータ型Stringを宣言する。
    文字列は、数字と文字の両方を含む一連の文字を表現するために使用される。
    Stringはデータ型に大文字を使うので、Dartを初めて学習するときにエラーの原因になることが多いので注意が必要。
    定義されたデータ型に対応する変数が必要となり、これを用いて関連する値を参照することになる。
    この段階での値の割り当ては任意である。
    Stringデータ型の典型的な使用例は、テキストのコレクション。DartのStringデータ型は、16ビットのUnicode Transformation Format(UTF-16)コードユニットを使用。Stringクラスはテキスト文字を表現するために使用されますが、エンコーディングにより、例えば絵文字のような拡張された文字もサポートすることができる。
    String変数を使用する場合、表示するテキストを特定するために一重引用符または二重引用符を使用することができる。複数行のテキストが必要な場合は、三重引用符を使用することができる。
marbullmarbull

1.6 Printing Information to the Console

  • Problem
    Dartアプリケーションからプログラム出力を表示したい。
  • Solution
    アプリケーションからの情報を表示するには、printステートメントを使用する。print文は、静的な内容(文字列リテラル)と可変の内容の両方を表示することができる。

以下は、変数の内容を表示する例。

void main() {
  print('Hello World!')
}

以下は、変数の内容を表示する例。

void main() {
  int intVariable = 10;
  var boolVariable = true;

  print(intVariable);
  print('$intVariable');
  print('The bool variable is $boolVariable');
}
  • Discussion
    print文の中で変数を参照するには、$文字を使用する。
    変数の前に$を付けると、Dartに変数が使用されており、この値を置き換える必要があることを通知できる。
    print文は、さまざまな場面で役に立つ。
    静的なコンテンツを出力する場合、情報を表示するために追加の手順を必要としない。
    静的なコンテンツで使用するには、値を引用符で囲むと、print文が残りの部分を処理する。
    変数の値を出力するには、変数の前に$記号を付ける必要があります。
    Dartを使用してコンテンツを出力する場合、値を表示させたい言語を指定する。
    2つ目の例では、print文の中で変数を参照する一般的な方法を3つ挙げている。
    Dartは中括弧が必要かどうかフィードバックします。しかし、複雑な変数型を作成した場合は、必要な要素を参照していることを確認する必要がある。
marbullmarbull

1.7 Adding a Constant Variable (Compile Time)

  • Problem
    どの時点でも変更できない(immutableな)変数を作りたい。
  • Solution
    const を使用すると、値が再割り当てされない変数を作成し、コンパイル時にチェックされる。

以下は、const変数を使った例です。

void main() {
  const daysInYear = 365;

  print('There are $daysInYear days in a year');
}

Dartでは、constは変更できない値を表す。
変数が変更される可能性がない場合、const キーワードを使用する。
この例では、数値365をセットしたconst変数を宣言している。
つまり、アプリケーションの範囲内では不変である。
もし、アプリケーション内でこの値を変更しようとすると、変数がconstで指定されているため、代入ができないことを示すコンパイル時エラーが表示される。
このタイプのエラーを確認するには、daysInYear = 10 をフィーチャーした行のコメントを削除する。
constの使用は、アプリケーションのエラーを減らすのに有効な方法。
変数を const で宣言することで、コンパイラが変数の使用を明示的に確認する堅牢なインターフェイスを提供できる。

marbullmarbull

1.8 Adding a Constant Variable (Runtime)

  • Problem
    変更できない(immutable)変数を作りたいが、アプリケーションを実行するまで値がわからない(ランタイム)。
  • Solution
    finalを使用して、値が再割り当てできない変数を作成する。
    const変数とは対照的に、final変数の値は実行時に代入される。
    以下はfinal変数を使った例。
void main() {
  final today = DateTime.now();

  print('Today is day ${today.weekday}');
}
  • Discussion
    Final は、実行時に決定される必要があり、変更されない値を表す。
    Final キーワードは、実行時に値を導き出す場合(つまり、アプリケーションがアクティブな場合)に使用する。
    ここでも、割り当てられた値は不変。
    ただし、const値とは異なり、コンパイル時に知ることはできない。
    すでに設定されているfinal変数に代入を行おうとすると、コンパイラはエラーを発生させる。
    このコード例では、print文が出力する日をdateTime関数で返している。
    返される値は、アプリケーションの実行時に決定されるため、ホストマシン上で利用可能な実際の曜日に基づいて表示される。
marbullmarbull

1.9 Working with Null Variables

  • Problem
    ある変数にデフォルト値としてnullを代入したい。
  • Solution
    宣言された変数に一貫した値を適用するには、null を使用する。
    Nullは、内容がないことを表すという意味で、興味深い概念。一般的にNULL値は、割り当てられるデフォルト値がない変数を初期化するために使用されます。この例では、nullは明示的に値が割り当てられていない変数を表すために使用することができます。
    以下は、Dartで変数をnullとして宣言する方法の例です。
void main() {
  int ?myVariable;

  print('ten: $myVariable');
  
  myVariable = 10;
  print('ten: $myVariable');
}
  • Discuttion
    nullをデータ型に代入できるようにするために、値がnullにもなりうることを明示的に示す?型を付加することが期待される。
    この例では、myVariableの前に?を付けることで、nullableに設定されている。
    Dartでは、nullはobjectでもあり、単純な値がないというユースケースを超えて使用することができることを意味する。
    Dart SDKの最近のバージョンでは、データ型がNullableかNon-Nullableかを明示的に認識することも要求されている。
    Dart v2.0では、NULL型の安全性がデフォルトとなり、すべてのデータ型にNULLを割り当てることができなくなったことに注意が必要。
    詳細については、Dart API の Null クラスのリファレンスを参照。
このスクラップは2023/02/09にクローズされました