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

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

前回

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

基本的なウィジェットのDefaultTextStyleウィジェットについて学習します。

基本的なウィジェット

DefaultTextStyleウィジェット

DefaultTextStyleウィジェットはTextウィジェットのスタイルとまとめて設定できる「親スタイル」のような存在です。
(そのまんまですね!)

Textウィジェットに対してまとめて同じスタイルを設定する場合に便利です。

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      // home: MyHomePage(title: 'Flutter Demo Home Page'),
      initialRoute: '/',
      routes: {
        '/': (context) => FirstPage(),
      },
    );
  }
}

class FirstPage extends StatelessWidget {
  Widget build(BuildContext context) {
    final ThemeData theme = Theme.of(context);
    final TextTheme textTheme = theme.textTheme;
    final titleStyle =
        textTheme.headline6!.copyWith(color: theme.backgroundColor);

    return Scaffold(
      appBar: AppBar(
          title: Text(
        'First Page',
        style: titleStyle,
      )),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.spaceAround,
        children: <Widget>[
          DefaultTextStyle(
            style: Theme.of(context)
                .textTheme
                .headline6!, // !を付けないとコンパイルエラーとなります・・・。

            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: <Widget>[Text('A'), Text('B'), Text('C')],
            ),
          ),
          // 比較用になにもスタイルを適用していないウィジェットを設置します
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: <Widget>[Text('D'), Text('E'), Text('F')],
          ),
        ],
      ),
    );
  }
}

実行するとABCに一括でスタイルが適用されています。
比較用に用意したDEFを比べればよくわかりますね。

最後に

スタイルをまとめて適用できるのは良いですよね。

今日はここまで!