Flutterで時間(時分秒)を入力するインターフェースの実装方法を調べたので軽く紹介します。
showTimePicker を使う
時間を入力する方法として最もメジャーなのが、showTimePicker()を使う方法だと思います。
ただし、showTimePicker()
は、モーダルダイアログで時(hour)/分(minute)を入力してTimeOfDay
を返す関数なので、秒(second)は入力できません。
デフォルト
デフォルトでは以下のようなUIになります。
個人的には、このデフォルトUIは、
- 時(hour)を選んでいるのか分(minute)を選んでいるのか分かりにくい
- 0時を選べない
というマイナスポイントがあると感じています。
該当部分の抜粋は以下の通りです(全文はこちら)。
TextButton(
child: Text('edit', style: TextStyle(decoration: TextDecoration.underline)),
onPressed: () async {
final TimeOfDay timeOfDay = await showTimePicker(context: context, initialTime: _timeOfDay);
if (timeOfDay != null) setState(() => {_timeOfDay = timeOfDay});
},
),
ポイントは以下です。
-
edit
ボタンをタップした際に、showTimePicker
を呼び出す -
await
して同期的に結果を受け取る - 結果を変数に反映して、
setState()
で変更を画面に反映する
24時間制
24時間制で入力させることもできます。
該当部分の抜粋は以下の通りです(全文はこちら)。
TextButton(
child: Text('edit', style: TextStyle(decoration: TextDecoration.underline)),
onPressed: () async {
final timeOfDay = await showTimePicker(
context: context,
initialTime: _timeOfDay,
initialEntryMode: TimePickerEntryMode.input,
builder: (BuildContext context, Widget child) {
return MediaQuery(
data: MediaQuery.of(context).copyWith(alwaysUse24HourFormat: true),
child: child,
);
},
);
if (timeOfDay != null) setState(() => {_timeOfDay = timeOfDay});
},
),
この例では、時間を直接入力するモードに変更した上で、24時間制になるようにしてみました。
以下二点をデフォルトから変更してます。
- 直接入力モードにために
initialEntryMode: TimePickerEntryMode.input
の設定を追加 -
builder
でalwaysUse24HourFormat: true
のMediaQuery
を設定
秒(second)まで入力できるようにしたい場合は、showTimePicker()
では対応できないため、別の方法が必要です。時分秒をシンプルに入力するプラグインは発見できなかったので、FlutterPickerを使う方法が良さそうです。
FlutterPicker を使う
Flutter Picker は、Array
・Number
・Date
・DateTime
などを、セレクトするPickerを提供してくれるプラグインです。今回はDateTime
型のPickerを利用します。
事前に、pubspec.yaml に以下の依存関係を追加する必要があります。
dependencies:
flutter_picker: ^2.0.1
該当部分の抜粋は以下の通りです(全文はこちら)。
import 'package:flutter_picker/flutter_picker.dart';
TextButton(
child: Text('edit', style: TextStyle(decoration: TextDecoration.underline)),
onPressed: () async {
Picker(
adapter: DateTimePickerAdapter(type: PickerDateTimeType.kHMS, value: _datetime, customColumnType: [3, 4, 5]),
title: Text("Select Time"),
onConfirm: (Picker picker, List value) {
setState(() => {_datetime = DateTime.utc(0, 0, 0, value[0], value[1], value[2])});
},
).showModal(context);
},
),
ポイントは以下です。
-
adapter
のtype
にPickerDateTimeType.kHMS
を指定して、hh:mm:ss
を入力するようにする -
adapter
のcustomColumnType
に3(hour), 4(minute), 5(sec)
を指定する -
onConfirm
で結果を取得して、_datetime
という変数に設定する