Menu
CoddyTech

Flexible 紧贴子元素

本课属于 Coddy Flutter 学习旅程的“适配不同屏幕的布局”单元。第 3 课,共 30 课。

Expanded 会让子组件填满剩余空间,即使它需要的空间更少也一样。用 Expanded 包裹的聊天气泡,即使只显示一个词,也会横跨整行。

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 在线编译器