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

Flutter如何通过代码向Column组件动态添加Widget?

问题原因
  • 初始Stateless版本问题:
    StatelessWidget是无状态组件,本身不支持状态更新触发重绘,即便修改了数组内容,也不会通知Flutter框架刷新UI;同时数组定义在build方法内,每次build都会被重置为空。
  • Stateful修改版本失效的核心原因:
    你把存储子组件的列表c定义在了build方法内部,每次调用setState都会触发build方法重新执行,c会被重新初始化为空数组,你在setState中新增的元素会被直接覆盖,自然看不到新增的Widget。
正确实现方案

将存储子组件的列表改为State类的成员变量,不要放在build方法内,示例代码如下:

import 'package:flutter/material.dart';

class SW extends StatefulWidget {
  const SW({Key? key}) : super(key: key);

  @override
  _SWState createState() => _SWState();
}

class _SWState extends State<SW> {
  // 将列表定义为State的成员变量,不会随build重复初始化
  List<Widget> c = [];

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: Scaffold(
        body: Column(children: [
          Column(children: c),
          ElevatedButton(
            onPressed: () {
              setState(() {
                print("testing");
                c.add(const Text("testing"));
              });
            },
            child: const Text("Add Text"),
          )
        ]),
      ),
    );
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return const SW();
  }
}

void main() {
  runApp(const MyApp());
}

补充说明:新增Scaffold是为了符合Material规范,避免顶层文本出现黄色下划线警示,不影响核心逻辑。

内容的提问来源于stack exchange,提问作者Lodea

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 00:42:01