【问题标题】:How do I add Widgets to a Column through code如何通过代码将小部件添加到列
【发布时间】:2021-07-02 13:44:38
【问题描述】:

我正在尝试将小部件动态添加到列。以下方法不起作用,因为单击按钮时不会添加文本小部件。我想了解为什么这不起作用以及我应该怎么做才能使它起作用。提前感谢您的帮助。

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    List<Widget> c = [];

    return MaterialApp(
      title: 'Flutter Demo',
      home: Column(children: [
        Column(children: c),
        ElevatedButton(onPressed: (){
          print("testing");
          c.add(Text("testing"));
        }, child: Text("Add Text"))
      ])
    );
  }
}

编辑:我将代码编辑为有状态小部件,并在将小部件添加到容器的函数周围添加了一个 setState 函数,但它仍然不起作用

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> {
  @override
  Widget build(BuildContext context) {
    List<Widget> c = [];

    return MaterialApp(
      title: 'Flutter Demo',
      home: Column(children: [
        Column(children: c),
        ElevatedButton(onPressed: (){
          setState((){
            print("testing");
            c.add(Text("testing"));
          });
        },
        child: Text("Add Text"))
      ])
    );
  }
}

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



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

【问题讨论】:

    标签: flutter


    【解决方案1】:
        import 'package:flutter/material.dart';
    
    void main() => runApp(MaterialApp(home:MyApp()));
    
    class MyApp extends StatefulWidget {
      @override
      _MyState createState() => _MyState();
    }
    
    class _MyState extends State<MyApp> {
    
      List<Widget> c = [];
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body:Column(children: [
            Column(children: c),
            ElevatedButton(onPressed: (){
              setState((){
    print("testing");
              c.add(Text("testing"));
    });
            }, child: Text("Add Text"))
          ]),
        );
      }
    }
    

    将您按下的代码封装在 setstate 中以重建页面。 setState 函数触发屏幕中显示的整个小部件树的重建。否则,文本小部件将仅添加到列表中,但不会显示在屏幕上。

    【讨论】:

    • 我尝试添加 setState 但它无法识别该功能,因此我进一步阅读并意识到我只能在有状态小部件上使用它。所以我编辑了我的代码,现在它确实可以识别 setState,但它仍然没有添加新的小部件
    • 已更新代码并进行了测试。现在试试这个
    • 好的!现在可以用了,太好了!但是为什么我编辑的代码不起作用?是因为 MyApp 本身不是有状态的小部件吗?
    • 不,您需要将材质应用小部件放置在 void main 中或此有状态小部件之外。如果您觉得这很有用,请接受答案。
    猜你喜欢
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    相关资源
    最近更新 更多