You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter星型图案生成器:变量无法动态更新输入值求助

问题分析与解决方案

核心问题点

  1. State内变量未同步父组件更新:_CustomBarWidgetState中使用late int _data = widget.data;仅在State初始化时赋值一次,后续父组件通过setState更新data后,该变量不会自动同步,导致生成列表时始终使用旧值。
  2. 列表数据未重置: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:05:42