Dartでの画面遷移の書き方
公開日: 2024-05-08 01:19:38
今回はDartを使っての画面遷移のコードのサンプルを作成したので、書いていきます。
Flutterの画面遷移の方法は何個かあるようで、Swiftのような書き方もできるみたいでした。
また使うときにどれが使いやすいか確認しながら、まとめていこうと思います。
lib以下のフォルダの構成はこちらのようになっています。
main.dart
import 'package:flutter/material.dart';
import 'view/view.dart';
import 'viewmodel/viewmodel.dart';
// アプリケーションのエントリーポイント
void main() {
runApp(MyApp());
}
// アプリケーションのメインウィジェット
class MyApp extends StatelessWidget {
// ビューモデルを初期化します。
final ScreenViewModel viewModel = ScreenViewModel();
@override
Widget build(BuildContext context) {
// アプリケーションのルート画面を設定します。
return MaterialApp(
home: ScreenPage(viewModel: viewModel, index: 0),
);
}
}
model.dart
// モデル部分 - 画面のデータ構造を表します。
class ScreenData {
final String title;
final String message;
// コンストラクタでタイトルとメッセージを設定します。
ScreenData({required this.title, required this.message});
}
viewmodel.dart
import '../model/model.dart';
// ビューモデル部分 - 画面のデータとビジネスロジックを管理します。
class ScreenViewModel {
// 複数の画面データを保持します。
final List<ScreenData> _screens = [
ScreenData(title: "First Page", message: "This is the first page"),
ScreenData(title: "Second Page", message: "This is the second page"),
];
// インデックスに対応する画面データを取得します。
ScreenData getScreenData(int index) {
return _screens[index];
}
// 画面データの数を取得します。
int get screenCount => _screens.length;
}
view.dart
import 'package:flutter/material.dart';
import '../viewmodel/viewmodel.dart';
// ビュー部分 - 画面のUIを表現します。
class ScreenPage extends StatelessWidget {
final ScreenViewModel viewModel;
final int index;
// コンストラクタでビューモデルとインデックスを設定します。
ScreenPage({required this.viewModel, required this.index});
@override
Widget build(BuildContext context) {
// ビューモデルからインデックスに対応する画面データを取得します。
final screenData = viewModel.getScreenData(index);
return Scaffold(
appBar: AppBar(
// 画面のタイトルを設定します。
title: Text(screenData.title),
),
body: Center(
child: ElevatedButton(
onPressed: () {
// 次の画面に遷移するか、前の画面に戻ります。
if (index < viewModel.screenCount - 1) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ScreenPage(viewModel: viewModel, index: index + 1),
),
);
} else {
Navigator.pop(context);
}
},
// ボタンのテキストを設定します。
child: Text(index < viewModel.screenCount - 1 ? "Go to Next Page" : "Back to First Page"),
),
),
);
}
}
実行結果

Swiftでもあった画面が作成され続けていないとかが不安になりますが、こちらのコードでは多分問題ないはず。
細かく学んでいこうと思います。