如何将控件动态添加到Flutter中的列?

时间:2018-07-31 03:40:23

标签: flutter flutter-layout

我在ListView内添加了一些小部件。这样我就可以滚动所有小部件。现在,我需要向ListView添加一个小部件以加载评论列表。我无法在ListView内添加ListView。而且,我不需要单独的滚动条来发表评论。它应该与ListView中的小部件一起滚动。因此,我计划添加Column而不是ListView。有什么帮助在Columns中动态添加我的评论吗?

new Expanded(
          child:
          new ListView(
            shrinkWrap: true,
            children: <Widget>[

              // Title

              new Padding(padding: const EdgeInsets.only(
                  top: 10.00, left: 10.00),
                child: new Text(
                  _feed.title, textAlign: TextAlign.start,),
              ),

              // content

              new Container(
                child: new Text(
                  _feed.content, textAlign: TextAlign.start,),
              ),

              // Comments List will go here

            ],
          ),
        ),

5 个答案:

答案 0 :(得分:9)

如果已经具有注释数据,只需创建一个列表,然后将其传递到children的{​​{1}}属性即可。像这样:

Column

如果您还没有注释数据,需要获取它,请在将来完成后使用FutureBuilder来构建UI。

答案 1 :(得分:1)

除了@Derek Lakin的解答(对我也有用)之外,如果您需要更新评论并重新加载,还需要致电setState()

var commentWidgets = List<Widget>();
for (var comment in comments) {
      commentWidgets.Add(Text(comment.text)); // TODO: Whatever layout you need foreach widget.
}
setState(() {

});

答案 2 :(得分:1)

目前(2021-06),Flutter 2.x 实现了 null-safe。 来自@Gene Bo 的答案应该有效,但几乎不需要修改。

这应该有效。

var pwdWidgets = <Widget>[];

Column(
  mainAxisAlignment: MainAxisAlignment.center,
  crossAxisAlignment: CrossAxisAlignment.center,
  children: this.pwdWidgets,
),

ElevatedButton(
  onPressed: (){
    this.pwdWidgets.add(Text("Hello World"),);
  },
  child: Text("click me"),
),

答案 3 :(得分:0)

通过维护对Column对象的引用,可以在声明.children对象之后引用Column字段/属性-像这样:

Column someColumn = Column(
  children: [],
);

someColumn.children.add(Text('Hello 123'));

答案 4 :(得分:-1)

import 'package:flutter/material.dart';

class LoginRegisterPage extends StatefulWidget {
  @override
  _LoginRegisterPageState createState() => _LoginRegisterPageState();
}

class _LoginRegisterPageState extends State<LoginRegisterPage> {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: AppBar(
        title: Text("App"),
      ),
      body: new Container(
        margin: EdgeInsets.all(15.0),
        child: new Form(
          child: new Column(
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: createInputs() + createButtons(),
          ),
          ),
      ),
    );
  } 

  List<Widget> createInputs(){
    return{
      SizedBox(height: 10.0),
      logo(),
      SizedBox(height: 20.0),
      new TextFormField(
        decoration: new InputDecoration(labelText: 'Email'),
      ),

      SizedBox(height: 10.0),
      new TextFormField(
        decoration: new InputDecoration(labelText: 'Passwors')
      ),
      SizedBox(height: 20.0), 
    };
  }

  Widget logo(){
      return new Hero(        
        tag:'hero',
        child: new CircleAvatar(
          backgroundColor:Colors.transparent,
          radius: 110.0,
          child: Image.asset("images\logo.PNG"),          
        ),         
        );
    }

    List<Widget> createButtons(){
    return{
      new RaisedButton(
        child: new Text("Login", style: new TextStyle(fontSize: 20.0),),
        textColor: Colors.pink,         
        onPressed: () {          
        },
        ),  

        new FlatButton(
        child: new Text("Already not have an account?", style: new TextStyle(fontSize: 14.0),),
        textColor: Colors.white,         
        onPressed: () {
        }, 
        )  
    };
  }
}