【 Flutter 】Flutter を 基礎 から 学習 ( ウィジェット編 ) part107 Async

基礎 から 学ぶ Flutter 」という書籍で  学習 したことを ブログでアウトプットしていこうと思います。今回は ウィジェット編 ( part107 )です。

前回

【 Flutter 】Flutter を 基礎 から 学習 ( ウィジェット編 ) part106 Async

引き続き、Asyncについて学びます。

StreamBuilderウィジェット

StreamBuildeウィジェットはStreamクラスをUIで扱うためのウィジェットです。

詳しいことは本書内のもっと先で説明があるとのことです。

これを使用すれば状態変更時に画面全体を再描画するのではなく、部分的に再描画できるように実装ができるかもしれない・・・
という解釈でよいですかね。

HTMLでいうとAjaxを使用して部分更新するみたいなことができるということだと今のところ理解しておきます。

StatefulWidgetとsetStateを使う

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
//intl: ^0.17.0
import 'package:intl/intl.dart';

void main() {
  // runApp(new MaterialApp(home: new MyApp()));
  runApp(new MaterialApp(home: new SamplePage()));
}

class SamplePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _SampleState();
  }
}

class _SampleState extends State<SamplePage> {
  _toDateTime(TimeOfDay t) {
    var now = DateTime.now();
    return DateTime(now.year, now.month, now.day, t.hour, t.minute);
  }

  bool _init = true;
  late DateTime _time = DateTime.now(); // late? これはなんでしょうか?

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Container(
          decoration: BoxDecoration(
            border: Border(
              bottom: BorderSide(width: 3),
            ),
          ),
          child: Text(
            _init ? "未選択" : DateFormat('hh:mm a').format(_time),
            style: TextStyle(fontSize: 50),
          ),
        ),
        ElevatedButton(
          child: Text(
            "時刻を選択する",
            style: TextStyle(fontSize: 20),
          ),
          style: ElevatedButton.styleFrom(
            primary: Colors.deepOrangeAccent, //ボタンの背景色
          ),
          onPressed: () async {
            final select = await showTimePicker(
              context: context,
              initialTime: TimeOfDay.now(),
            );
            this.setState(() => _time = _toDateTime(select!));
            this.setState(() {
              _time = _toDateTime(select!);
              _init = false;
            });
          },
        ),
      ],
    );
  }
}

 

なぜ背景が黒くなるのかわかっていません。
そして動きが少し変です(笑

 

StreamBuilderを使う

※「アーキテクチャ」の部分で説明するとのことなので後日確認します!

最後に

これは面白くなりそうな予感です。
しかしこの解説はずっと先の話・・・。

今日はここまで!

 

参考

FlutterのStreamBuilderをつかって無駄な再描画を減らそう – Qiita

dart – Late Initialization Error in Flutter because of _startDate – Stack Overflow

時計を表示して時刻の入力を簡単にする TimePicker の利用方法 – 各種 Material ウィジェットの使い方 – Flutter 入門 (keicode.com)

android – How to format DateTime in Flutter – Stack Overflow

datetime – Convert time to am/pm flutter – Stack Overflow