Flutter星型图案生成器:变量无法动态更新输入值求助
问题分析与解决方案
核心问题点
- State内变量未同步父组件更新:
_CustomBarWidgetState中使用late int _data = widget.data;仅在State初始化时赋值一次,后续父组件通过setState更新data后,该变量不会自动同步,导致生成列表时始终使用旧值。 - 列表数据未重置:
starList作为State成员变量,每次点击Enter调用buildlist时只会追加新元素,未清空旧数据,导致列表长度只增不减。
修复后的代码
1. 修改_CustomBarWidgetState
class _CustomBarWidgetState extends State<CustomBarWidget> { void buildlist() { // 每次调用新建空列表,避免旧数据残留 final starList = []; // 直接使用widget.data,自动同步父组件的最新值 for (int i = 0; i < widget.data; i++) { starList.add(StarRow(index: 1)); } debugPrint('${widget.data}'); widget.getList(starList); } @override Widget build(BuildContext context) { return AppBar( backgroundColor: Colors.transparent, elevation: 0, title: Row( children: <Widget>[ TextfielWidget(onChange: (val) { widget.sendData(int.parse(val)); }), ElevatedButton( onPressed: buildlist, style: ElevatedButton.styleFrom( padding: const EdgeInsets.symmetric(horizontal: 40.0, vertical: 15.0), shape: const StadiumBorder(), ), child: const Text( "Enter", style: TextStyle(color: Colors.white, fontSize: 18), ), ), ], ), ); } }
2. 简化StarTriangleWidget(可选,优化逻辑)
原代码中list变量实际未被使用,可直接通过data生成列表,减少不必要的状态传递:
class StarTriangleWidget extends StatelessWidget { final int data; const StarTriangleWidget({super.key, required this.data}); @override Widget build(BuildContext context) { return ListView.builder( itemCount: data, itemBuilder: (context, index) { return Center(child: StarRow(index: index + 1)); }); } }
3. 简化_RootPageState(对应上面的优化)
class _RootPageState extends State<RootPage> { int data = 1; void getData(int newNumb) { setState(() { data = newNumb; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: CustomBarWidget(sendData: getData, data: data), body: StarTriangleWidget(data: data)); } }
修复说明
- 移除
_CustomBarWidgetState中多余的_data和_getList变量,直接使用widget.data和widget.getList,确保父组件更新后能拿到最新值。 - 将
starList改为buildlist方法的局部变量,每次调用都重新创建空列表,彻底避免旧数据残留。 - 可选优化:去掉冗余的
list状态传递,直接用data控制列表长度,简化整体逻辑。
内容的提问来源于stack exchange,提问作者Patrickj
相关产品推荐
相关产品推荐

