面试题答案
一键面试布局设计与优化思路
- 使用Flexible和Expanded:对于需要根据剩余空间自适应的子Widget,使用
Flexible
或Expanded
。Expanded
是Flexible
的特殊情况,它会尽可能地占用剩余空间。例如,在Row
中,如果有几个子Widget需要平均分配剩余空间,可以使用Expanded
包裹它们。 - MediaQuery:利用
MediaQuery
获取设备屏幕尺寸信息,根据不同的屏幕尺寸进行布局调整。例如,在大屏设备上可以采用更复杂的多列布局,而在小屏设备上采用单列布局。 - AspectRatio:对于一些需要保持特定宽高比的Widget,使用
AspectRatio
来确保在不同屏幕尺寸下都能正确显示。 - SizedBox和ConstrainedBox:合理使用
SizedBox
来设置固定尺寸,ConstrainedBox
来设置最大或最小尺寸限制,防止Widget超出边界。
核心布局代码框架示例
import 'package:flutter/material.dart';
class ResponsiveLayout extends StatelessWidget {
@override
Widget build(BuildContext context) {
final size = MediaQuery.of(context).size;
return Scaffold(
appBar: AppBar(
title: Text('Responsive Layout'),
),
body: Column(
children: [
// 顶部固定高度区域
SizedBox(
height: 100,
child: Container(
color: Colors.blue,
child: Center(
child: Text('Fixed Height Area'),
),
),
),
// 自适应高度区域
Expanded(
child: Row(
children: [
// 左侧自适应宽度区域
Expanded(
child: Container(
color: Colors.green,
child: Center(
child: Text('Left Expanded Area'),
),
),
),
// 右侧固定宽度区域
SizedBox(
width: 200,
child: Container(
color: Colors.red,
child: Center(
child: Text('Fixed Width Area'),
),
),
),
],
),
),
],
),
);
}
}
在上述代码中:
SizedBox
设置了固定高度和宽度的区域。Expanded
让子Widget自适应剩余空间,在Row
中实现了左右区域的灵活布局,在Column
中实现了上下区域的灵活布局。MediaQuery
获取屏幕尺寸,虽然在这个简单示例中未做复杂的屏幕尺寸判断,但可以在此基础上添加条件判断来实现更复杂的响应式布局。