logo

自分専用の電車時刻表アプリを Flutter で作った

Blog Eyecatch

2026.5.18

このアプリを作った動機

自分がよく使う路線は
アルピコ交通上高地線という
1 時間に 1 本のローカル線です。

電車の時刻を確認することが
日常茶飯事というか電車を使うなら時刻表チェックが必須。
ところが、既存の汎用時刻表アプリは
タップやネットワーク往復が多くて、
目的の電車情報にたどり着くまで
意外と面倒なんですよね。

それなら、自分が知りたい情報だけを
最短で表示する、
自分専用のアプリ
作ってしまおうと思い立ちました。

使った技術

言語とフレームワークは Flutter / Dart。
SDK は ^3.11.5、
UI は Material 3 を採用しました。

位置情報の取得には geolocator
日時処理には intl を使用。
時刻表データはネットワーク非依存にしたかったので、
lib/data/train_schedule.dart
大庭→松本 25 本、松本→大庭 25 本を
ハードコードしています。

ドメインロジックは純粋関数として切り出し、
flutter_test でユニットテストも書きました。
対応プラットフォームは Android のみで、
実機は Android 14 で検証しています。

「現在」タブで次の電車を一発表示

メインの機能は「現在」タブ。
アプリ起動時に GPS と現在時刻から
次の電車を自動で表示します。

とにかく、アプリを開いたら、
ノータッチで
「次の電車は何時何分?」
というのが知りたい。

そこで、現在時刻と現在位置から
自宅なら大庭駅発の次の電車が
出先(ほとんど松本駅周辺)なら松本駅発の次の電車が
表示されるようにしてます。

判定は
大庭駅から 500m 圏内なら
大庭発・松本行き の次の電車を、
松本駅から 1km 圏内なら
松本発・新島々方面 の次の電車を表示。
圏外なら大庭駅にフォールバックします。

GPS の結果と違う駅の電車を見たい時のために、
駅名横の アイコンで
対象駅を手動切り替えもできるようにしました。
タブを離れると自動判定に戻ります。

「松本着」「大庭着」タブで逆算

もう 2 つの機能は逆算タブです。

「松本着」タブでは、
時刻ピッカーで希望到着時刻を入力すると、
その時刻に間に合う最終の大庭発電車
表示してくれます。

入力時刻は現在時刻に依存しないので、
明日のお出かけプランを立てる時にも
そのまま使えます。
始発でも間に合わない時刻を選んだ場合は
「間に合う電車はありません」と表示。

「大庭着」タブも同じ仕組みで、
帰りの電車を逆算してくれます。

作ってみて思ったこと

汎用アプリの「便利さ」を捨てて、
自分のユースケースだけに
全振りしたアプリを作ると、
驚くほど使い心地が良くなることに気付きました。

特に「現在」タブは、
アプリを起動した瞬間に
知りたい情報が出ているので、
体感としては「時計を見る」のと変わりません。

副次的な目的だった、
Flutter で位置情報や現在時刻を扱う実装パターンも
ひと通り学べたので、
個人開発としては大満足の成果でした。

最後まで読んでいただきありがとうございます。