の初っ端にある次の
サンプルコード
import 'dart:convert';
import 'package:http/http.dart' as http;
class Package {
final String name;
final String latestVersion;
final String? description;
Package(this.name, this.latestVersion, {this.description});
@override
String toString() {
return 'Package{name: $name, latestVersion: $latestVersion, description: $description}';
}
}
void main() async {
final httpPackageUrl = Uri.https('dart.dev', '/f/packages/http.json');
final httpPackageResponse = await http.get(httpPackageUrl);
if (httpPackageResponse.statusCode != 200) {
print('Failed to retrieve the http package!');
return;
}
final json = jsonDecode(httpPackageResponse.body);
final package = Package(
json['name'],
json['latestVersion'],
description: json['description'],
);
print(package);
}
に面食らいはしたけど、(何をimportしているかはまだよう分からん(-_-;)として)
とりあえずJavaとかと同様に最初のclass Package{~}で、次のvoid main() async{~}で使うインスタンスの準備をしていたことは分かった。
ということで次はvoid main() async{~}を調べていく。
①「void」とは何か
ざっと調べた感じ、この人の説明が簡潔だった。
要は、あるユーザー関数をJavaと同じ感じで定義した際に返り値が「ない」ことを示す記号らしい。
たしかに言われてみれば、
(ユーザー定義)関数は
返り値の型 関数名 (引数の型 引数の変数名){
処理
return 値または変数または式
}
という形だから、そのアナロジーとして見て取れる。(※「返り値の型」の部分にvoidがいる)
なお、ここでいう処理とは、ざっと調べた限り
①変数宣言
②関数呼び出し(print()等)
③条件分岐(if文等)
④ループ(for文等)
⑤オブジェクトの操作(インスタンス作る、[メソッド]使う等)
がそれにあたるらしい。なお、Flutterのプロジェクトの雛形作ったときにまずさわるlib/main.dartの
void main() {
runApp(const MyApp());
}
の runApp(const MyApp())も「関数の呼び出し」らしい。
runApp(const MyApp()) はFlutterフレームワークを起動して、指定したウィジェット(MyApp)を画面に表示し始めるための関数
②main(){}とは何か
先の@kokogento(ここ げんと)さんの Qiita(FlutterとDart voidとmain()って何?)にもあったが、ざっくりいうと
「アプリを起動したときに最初に呼ばれるところ」
らしい。実際、Dartの公式docにも次のようにある。
(※それぞれIntroduction to DartのHello World、Funcitonsの#the-main-functionにリンクしています)
Google翻訳してちょっと修正したもの
Hello World
すべてのアプリは、実行開始点となるトップレベルの main() 関数を必要とします。明示的に値を返さない関数は voidを返り値のデータ型として持ちます。コンソールにテキストを表示するには、トップレベルの print() 関数を使用します。
void main() {
print('Hello, World!');
}
Google翻訳してちょっと修正したもの
main() 関数
すべてのアプリには、アプリへのエントリポイントとして機能するトップレベルの main() 関数が必要です。main() 関数は void を返し、引数としてオプションの List<String> パラメータを持ちます。
DartにおけるList<String> パラメータとは、
「文字列(String)のリスト(配列)を受け取る関数(またはクラス)の引数」
まず、単純なmain()関数を示します。
void main() {
print('Hello, World!');
}
次に文字列のリストを引数に取るコマンドライン アプリの main() 関数の例を示します。
// Run the app like this: dart run args.dart 1 test
void main(List<String> arguments) {
print(arguments);
assert(arguments.length == 2);
assert(int.parse(arguments[0]) == 1);
assert(arguments[1] == 'test');
}
なお、本記事の主題とは逸れるが、以下の記事の通り、この後者のmain()関数の例は、DartPadでは実行できない(※「▶Run」を押して実行しようとすると次のようになる)
※右のエラーをGoogle翻訳に突っ込むと
「Too few positional arguments: 1 required, 0 given.」
位置引数が少なすぎます: 必要な引数は1個、実際に渡された引数は0個です。
「Found this candidate, but the arguments don't match.」
候補は見つかりましたが、引数が一致しません。
※このエラーになったコードをVSCode、Android Studioで動かすにはどうすればいいかは以下の記事にまとめました。
「Flutter学習備忘録⑥ Dart単発のファイルをVSCodeやAndroid StudioにおいてCLIで実行する方法」
https://qiita.com/thinking-weed/items/ff92408cfd301f550442
③async(/ˈeɪsɪŋk/:エイシンク)とは何か
非同期(asynchronous)(時間のかかる処理(API通信など)の完了を待たずに、他の処理を並行して進めるための仕組み)の略
イメージは参考資料④の冒頭参照
なおここでは、表題にあるような以下のように関数名の直後につける「async」を指す
void main() async{~}
↑
以下のようにHTML内の<script>タグ内で使うasync属性(HTML の解析(パース)と並行してスクリプトが実行されるようにする)とは全くの別物
<script src="app.js" async></script>
↑
この
返り値の型 関数A (引数の型 引数の変数名) async{
処理 ↑
return 値または変数または式
}
//「引数の型 引数の変数名」「return 値または変数または式」はない場合もある
というのは、関数Aが非同期関数(Async Function)であることを宣言するためのキーワード(=書くと自動的に非同期関数とみなされる)
⇒ 関数AがFutureを返すようになる。また、処理のところでawaitが使えるようになる
※Dartの「Future」は JavaScriptでいうところの「Promise(「1回だけ値を返す非同期処理」を表現するオブジェクト 例えば主な参考資料⑤参照)」に相当する
学習を進める過程で出てきた用語・再度意味を確認した用語③
①sequence(シーケンス)
プログラミングにおける シーケンス(sequence) は「順番が決まっている複数のデータを並べたもの」 を指す概念。
Dartにおけるシーケンスの具体例
①List(リスト ※他の言語でいう一般的な配列)
List<int> numbers = [1, 2, 3];
List<String> names = ['Alice', 'Bob'];
〇重要な特徴
・インデックスで特定の要素を取り出せる(a[0] など)
・要素の追加・削除ができる
・長さ(length)がすぐ分かる
②String(文字列) ※String も「文字の並び」という意味でシーケンス
String s = "Hello";
print(s[1]); // 'e'
③Iterable(イテラブル)
Iterable<int> iterable = [1, 2, 3];
Iterable<int> seq = [1, 2, 3].map((x) => x * 2);
〇重要な特徴
・for (var x in iterable) のように「順番に取り出すこと」はできるが、特定の要素をインデックスで取り出すことはできない
・要素の追加・削除はできない
・.map()のようなメソッドを使って作られている場合、そのメソッドの意味を知らない&中身を読み解かないと実際の要素を把握できないことが多い。
なお、後者は例えばこうなる
主な参考資料
①Flutterで始めるはじめてのモバイルアプリ開発 Tamappe (著) 技術評論社
②【Flutter/Dart】Dartの文法について学ぼう @my_programming(Python Lover) さんQiita
https://qiita.com/my_programming/items/9ba25114ef217d077ca5
③Dart List型の使い方 @kskg4 さんQiita
https://qiita.com/kskg4/items/2dd7459d2d274708b971
④async / awaitについて、再確認(超初心者向け) ss_shirakiさんZenn
https://zenn.dev/singularity/articles/360d69fde8322d
⑤非同期処理「Async/Await」の使い方とメリット @nakajima417 さん Qiita
https://qiita.com/nakajima417/items/937509491a7033243e86
⑥【JavaScript】非同期処理の第一歩:コールバック関数を理解しよう maboさんZenn
https://zenn.dev/mabo23/articles/d6e770b5ad0b7d

