Balbas Code

Dartでの画面遷移の書き方

公開日: 2024-05-08 01:19:38

今回はDartを使っての画面遷移のコードのサンプルを作成したので、書いていきます。
Flutterの画面遷移の方法は何個かあるようで、Swiftのような書き方もできるみたいでした。
また使うときにどれが使いやすいか確認しながら、まとめていこうと思います。

lib以下のフォルダの構成はこちらのようになっています。
sample_navigation
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"),
),
),
);
}
}

 


実行結果
sample_navigationsample_navigation

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