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
相关产品推荐
相关产品推荐

