Menu
CoddyTech

Flexibleが子要素に合わせる

CoddyのFlutterジャーニー「画面サイズに合わせたレイアウト」セクションの一部。レッスン 3/30。

Expandedを使うと、子ウィジェットは必要なスペースが少なくても、残りのスペースを埋めます。Expandedで囲まれたチャット吹き出しは、1語のメッセージでも行全体に広がります。

Flexibleを使うと、子ウィジェットに同じスペースを最大で割り当てつつ、それより小さいサイズのままにすることもできます。

Row(
  children: [
    const CircleAvatar(child: Text('A')),
    Flexible(
      child: Container(
        color: Colors.grey.shade300,
        child: const Text('Hello'),
      ),
    ),
  ],
)

短いメッセージなら、吹き出しも小さくなります。長いメッセージは行の端に達するまで広がり、その後は複数行に折り返されます。Flexibleは、残りのスペースを超えて広がることはないためです。

子ウィジェットにスペースを埋めさせる場合はExpandedを使い、埋めてもよい場合はFlexibleを使います。

challenge icon

チャレンジ

簡単

Hi!の吹き出しが画面全体に広がっています。長いメッセージが画面内で折り返されるようにしながら、各吹き出しの幅をメッセージに合わせてください。

自分で試してみよう

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(title: const Text('Chat')),
        body: Padding(
          padding: const EdgeInsets.all(16),
          child: Column(
            children: [
              Row(
                children: [
                  const CircleAvatar(child: Text('S')),
                  const SizedBox(width: 8),
                  Expanded(
                    child: Container(
                      padding: const EdgeInsets.all(12),
                      decoration: BoxDecoration(
                        color: Colors.grey.shade300,
                        borderRadius: BorderRadius.circular(16),
                      ),
                      child: const Text('Hi!'),
                    ),
                  ),
                ],
              ),
              const SizedBox(height: 12),
              Row(
                children: [
                  const CircleAvatar(child: Text('S')),
                  const SizedBox(width: 8),
                  Expanded(
                    child: Container(
                      padding: const EdgeInsets.all(12),
                      decoration: BoxDecoration(
                        color: Colors.grey.shade300,
                        borderRadius: BorderRadius.circular(16),
                      ),
                      child: const Text(
                        'Are you coming to the park later? We meet at the big tree by the lake.',
                      ),
                    ),
                  ),
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

画面サイズに合わせたレイアウトのすべてのレッスン

自分で練習してみよう: Flutterオンラインコンパイラ