INDEX / JOURNAL / LOG-001
VOL. 2026 · ENGINEERING
SERIES 1 / 7
LOG-001 · APP ENTRYPOINT

Flutter アプリはどこから始まるのか

PUBLISHED
2026 · 06 · 12
AUTHOR
MIGIWAYA
READ
約 6 分
TAGS
#flutter#dart

§ 01ENTRYPOINT

lib/main.dartDART
void main() => runApp(const App());
lib/main.dartDART
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await bootstrap();
runApp(const App());
}

§ 02BINDING

Binding has not yet been initialized.
lib/bootstrap.dartDART
Future<void> bootstrap() async {
// 互いに独立した初期化は並行に走らせる
await Future.wait([
configureLogging(),
openLocalDatabase(),
initRemoteSdk(),
]);
}

§ 03RUNAPP

lib/main.dartDART
runApp(
const ProviderScope( // 状態と依存をツリー全体へ配るスコープ(Riverpod の例)
child: App(),
),
);
lib/app.dartDART
class App extends StatelessWidget {
const App({super.key});
 
@override
Widget build(BuildContext context) {
return MaterialApp.router(
title: 'My App',
routerConfig: appRouter, // go_router などが返すルーティング設定
);
}
}

§ 04GUARD

lib/main.dartDART
Future<void> main() async {
runZonedGuarded(
() async {
WidgetsFlutterBinding.ensureInitialized();
 
// Flutter フレームワーク内で起きる例外
FlutterError.onError = (details) {
FlutterError.presentError(details); // コンソールにも従来どおり出す
reportCrash(details.exception, details.stack);
};
 
await bootstrap();
runApp(const App());
},
// このゾーン内で捕まえきれなかった非同期例外
(error, stack) => reportCrash(error, stack),
);
}

§ 05CONFIG

flutter run --dart-define=API_BASE_URL=https://staging.example.com --dart-define=STAGING=true
lib/config/app_config.dartDART
class AppConfig {
static const apiBaseUrl = String.fromEnvironment(
'API_BASE_URL',
defaultValue: 'https://api.example.com',
);
 
static const isStaging = bool.fromEnvironment('STAGING');
}
DART
import 'package:flutter/foundation.dart';
 
bool get isMobile =>
!kIsWeb &&
(defaultTargetPlatform == TargetPlatform.iOS ||
defaultTargetPlatform == TargetPlatform.android);

§ 06SUMMARY

脚注 · NOTES
  1. [1]
  2. [2]
  3. [3]
同シリーズ · Flutter の基礎を実コードで学ぶ
§ + RELATED すべて見る →
INQUIRY
CONTACT
LOCATION
STATUS
Active / Open
ESTABLISHED
2024 · 5 · 5
FORM