0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Flutter学習備忘録⑤ Dart文法学習~約7日目 void main() async {~}の「void」「main」「async」とは

Last updated at Posted at 2025-12-21

の初っ端にある次の

サンプルコード
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」を押して実行しようとすると次のようになる)

image.png

※右のエラーをGoogle翻訳に突っ込むと

「Too few positional arguments: 1 required, 0 given.」
 位置引数が少なすぎます: 必要な引数は1個、実際に渡された引数は0個です。

「Found this candidate, but the arguments don't match.」
 候補は見つかりましたが、引数が一致しません。

※このエラーになったコードをVSCodeAndroid 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(リスト ※他の言語でいう一般的な配列)

sample_List.dart
List<int> numbers = [1, 2, 3];
List<String> names = ['Alice', 'Bob'];

〇重要な特徴
インデックスで特定の要素を取り出せる(a[0] など)
要素の追加・削除ができる
・長さ(length)がすぐ分かる

②String(文字列) ※String も「文字の並び」という意味でシーケンス

sample_String.dart
String s = "Hello";
print(s[1]); // 'e'

③Iterable(イテラブル)

sample_Iterable.dart
Iterable<int> iterable = [1, 2, 3];
Iterable<int> seq = [1, 2, 3].map((x) => x * 2);

〇重要な特徴
for (var x in iterable) のように「順番に取り出すこと」はできるが、特定の要素をインデックスで取り出すことはできない
要素の追加・削除はできない
.map()のようなメソッドを使って作られている場合、そのメソッドの意味を知らない&中身を読み解かないと実際の要素を把握できないことが多い。

なお、後者は例えばこうなる

image.png

主な参考資料

①Flutterで始めるはじめてのモバイルアプリ開発 Tamappe (著) 技術評論社

Amazonリンク

https://www.amazon.co.jp/Flutter%E3%81%A7%E5%A7%8B%E3%82%81%E3%82%8B%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA-Tamappe/dp/4297146398/ref=asc_df_4297146398?mcid=37c0257d485a30ec91eb971b1aec99b5&th=1&psc=1&tag=jpgo-22&linkCode=df0&hvadid=707442440784&hvpos=&hvnetw=g&hvrand=1869141850082901980&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9191816&hvtargid=pla-2386528293051&psc=1&hvocijid=1869141850082901980-4297146398-&hvexpln=0

②【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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?