【 Flutter 】Flutter を 基礎 から 学習 ( ウィジェット編 ) part14 基本的なウィジェット

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

前回

【 Flutter 】Flutter を 基礎 から 学習 ( ウィジェット編 ) part13 基本的なウィジェット

引き続き、基本的なウィジェットについて学びます。

基本的なウィジェット

Image,RowImageウィジェット

loadingBuilder

ネットワークから大きな画像を取得するとき、多少時間がかかります。
とはいっても現代のネットワークにおいては大体一瞬で転送できてしまいますが🙂

loadingBuilderプロパティは「画像取得中」と「画像取得完了」を判断できます。
取得状況によって表示を切り替えることができる頭の良いウィジェットです。

場合によっては前回のAnimatedOpacityプロパティで実装するよりも簡単にできそうですね。

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

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

var ok = false;

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _State();
  }
}

class _State extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('テスト中です。'),
        ),
        // https://api.flutter.dev/flutter/widgets/Image/frameBuilder.html
        // のサンプルを引用させていただきました。
        body: Center(
          child: Image.network(
            'https://flutter.github.io/assets-for-api-docs/assets/widgets/puffin.jpg',
            loadingBuilder: (
              BuildContext context,
              Widget child,
              ImageChunkEvent? loadingProgress, // ImageChunkEventに「?」が必要です。
            ) {
              if (loadingProgress == null) return child;
              return Center(
                // 画像取得完了まで丸い輪が表示されます。
                child: CircularProgressIndicator(
                  value: loadingProgress.expectedTotalBytes != null
                      ? loadingProgress.cumulativeBytesLoaded /
                          loadingProgress
                              .expectedTotalBytes! //expectedTotalBytesはint?型なので「!」が必要です。
                      : null,
                ),
              );
            },
          ),
        ),
      ),
    );
  }
}

一瞬ですが輪が表示されます!

最後に

これはとても簡単に利用できそうですね。
frameBuilderは細やかな実装が得意なのだと思いました。

今日はここまで!