面试题答案
一键面试实现思路
- 使用
StatefulWidget
:因为需要动态添加或删除子Widget,所以使用StatefulWidget
来管理状态变化。 - 维护子Widget列表:在
State
类中创建一个列表来存储子Widget。 - 添加和删除操作:提供方法来向列表中添加新的子Widget或从列表中删除指定的子Widget。
- 布局设置:使用
Column
布局,并通过mainAxisAlignment
设置为MainAxisAlignment.center
来实现垂直居中,通过mainAxisSize
设置为MainAxisSize.min
以适应子Widget大小,同时使用crossAxisAlignment
控制交叉轴对齐方式。对于间距均匀,可以使用Space
或SizedBox
来控制间距。
关键代码片段
import 'package:flutter/material.dart';
class DynamicColumn extends StatefulWidget {
@override
_DynamicColumnState createState() => _DynamicColumnState();
}
class _DynamicColumnState extends State<DynamicColumn> {
List<Widget> _children = [];
void _addChild() {
setState(() {
_children.add(Container(
height: 50,
width: 100,
color: Colors.blue,
));
});
}
void _removeChild(int index) {
setState(() {
if (index < _children.length) {
_children.removeAt(index);
}
});
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
for (int i = 0; i < _children.length; i++)
Column(
children: [
_children[i],
if (i < _children.length - 1) SizedBox(height: 10),
],
),
ElevatedButton(
onPressed: _addChild,
child: Text('添加子Widget'),
),
for (int i = 0; i < _children.length; i++)
ElevatedButton(
onPressed: () => _removeChild(i),
child: Text('删除子Widget $i'),
),
],
);
}
}
在main
函数中调用:
void main() {
runApp(MaterialApp(
home: Scaffold(
body: DynamicColumn(),
),
));
}