如何在Flutter中动态附加到Column小部件的子级

Que*_*232 5 oop android widget flutter

Flutter是一个相当新的框架,因此在简单任务上没有太多帮助。我要特别问的是如何将Card小部件添加到Column小部件中。下面提供了源代码,以帮助解释我的意思。

可以说我有一个创建新卡的功能,如下所示:

buildRow(barcode, letter, name, price) {
  return new Card(
    child: new Column(
      crossAxisAlignment: CrossAxisAlignment.stretch,
      children: <Widget>[
        new ListTile(
          leading: new CircleAvatar(
            child: new Text(letter),
          ),
          title: new Text(name),
          subtitle: new Text("\$" + price),
          trailing: new Text(
            "x1",
            style: new TextStyle(color: Colors.lightBlue),
            textScaleFactor: 1.2,
          ),
        ),
      ],
    ),
  );
}
var snack = buildRow("091918229292", "C", "Crackers", "\$4.00");
var fruit = buildRow("091928229292", "P", "Pomegranate", "\$2.00");
var juice = buildRow("091948229292", "K", "Kiwi Juice", "\$20.00");
Run Code Online (Sandbox Code Playgroud)

而且我有以下屏幕/页面:

class Home extends StatefulWidget {
  @override
  HomePage createState() => new HomePage();
}

class HomePage extends State<Home> {
  @override
  Widget build(BuildContext context) {
    return new Column(children: <Widget>[

    ]);
  }
}
Run Code Online (Sandbox Code Playgroud)

可以说,所有提供的代码都在同一个文件中。如何在主屏幕的“列”小部件的子项中添加“零食”,“水果”和“果汁”?

Ben*_*sal 10

在列中,您可以通过地图添加子项,如下所示:

Column(
  children: List<Widget>.generate(length, (index) {
    return Container(
      child: Text('$index')
    );
  })
)
Run Code Online (Sandbox Code Playgroud)


Que*_*232 9

好的,我已经解决了我的问题,我所做的是创建一个新列表,如下所示:

List<Widget> v = [];
Run Code Online (Sandbox Code Playgroud)

并像这样列出身体的孩子:

class HomePage extends State<Home> {
  @override
  Widget build(BuildContext context) {
    return new Column(children: v);
  }
}
Run Code Online (Sandbox Code Playgroud)

之后我创建了一个函数来附加如下:

buildRow(barcode, letter, name, price) {
  v.add(new Card(
    child: new Column(
      crossAxisAlignment: CrossAxisAlignment.stretch,
      children: <Widget>[
        new ListTile(
          leading: new CircleAvatar(
            child: new Text(letter),
          ),
          title: new Text(name),
          subtitle: new Text("\$" + price),
          trailing: new Text(
            "x1",
            style: new TextStyle(color: Colors.lightBlue),
            textScaleFactor: 1.2,
          ),
        ),
      ], 
    ),
  ));
}
Run Code Online (Sandbox Code Playgroud)

最后我使用 setState 函数将更改应用于屏幕。


Tre*_*ree 6

如果您手动更新源,这是一个基本示例。

      Column(
        children: _createChildren(),
      )
Run Code Online (Sandbox Code Playgroud)

///////

这是创建您要填充到列的窗口小部件列表的方法

  List<int> someList = [1, 2, 3, 4, 5];
  List<Widget> _createChildren() {
    return new List<Widget>.generate(someList.length, (int index) {
      return Text(someList[index].toString());
    });
  }
Run Code Online (Sandbox Code Playgroud)

//////

因此,当您更新列表时,请在 setState

  void _somethingHappens() {
    setState(() {
      someList.add(6);
    });
  }
Run Code Online (Sandbox Code Playgroud)

现在,如果您从流中接收数据,则可以进行检查StreamBuilder,或者如果数据来自,则Future可以使用FutureBuilder

这个例子也可以定期进行 Builder