使用按钮添加动态小部件

3

当我尝试向我的应用程序添加动态小部件时,我遇到了一个奇怪的错误。当我按下添加按钮时,屏幕变成完全白色,我找不到原因。

我使用https://www.youtube.com/watch?v=xPW1vtDDlt4作为资源。我是Flutter的新手,也许我忘记了添加某些内容,但我已经检查了很多次。

这是我的代码:

class DynamicWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: new TextField(
        decoration: new InputDecoration(hintText: 'Press + to Add Field'),
      ),
    );
  }
}

列表的初始化。

  List<DynamicWidget> listDynamic = [];

我的函数用于向列表中添加小部件。

  addDynamic() {
    listDynamic.add(new DynamicWidget());
    print("addDynamic");
    setState(() {});
  }

我不确定,但问题可能在这里:

final testText = Visibility(
  child: new Column(
    children: <Widget>[
      new Flexible(
        child: new ListView.builder(
          itemCount: listDynamic.length,
          itemBuilder: (_, index) => listDynamic[index],
        ),
      ),
    ],
  ),
);

这里我调用了我的小部件,将其声明为变量。

final body = Container(
      child: SingleChildScrollView(
        child: Column(
          children: <Widget>[
            testText,
            strPhoto
          ],
        ),
      ),
    );

最后是我的按钮。
    return Scaffold(
        appBar: new AppBar(title: new Text(device_type), centerTitle: true),
        drawer: Menu(),
        body: body,
        floatingActionButton: Column(
          crossAxisAlignment: CrossAxisAlignment.end,
          mainAxisAlignment: MainAxisAlignment.end,
          children: <Widget>[
            FloatingActionButton(
              heroTag: null,
              child: Icon(
                Icons.add,
                color: Colors.white,
              ),
              onPressed: () {
                addDynamic();
              },
            ),
          ],
        ));
 

Thanks for helping me.


1
这些代码块都在一个文件中吗?如果是的话,请更新你的问题,将所有这些代码块合并成一个代码块。因为可能会出现函数、testText和其他内容提供的位置不明确的问题。 - undefined
我知道每个代码块在做什么。但是我希望将它们全部放在一个代码块中。因为你的代码格式可能有问题。我已经复制了所有这些代码,但无法运行。在SingleChildScrollView中出现了错误。如果你能将它们都放在一个代码块中,那将非常有帮助。 - undefined
2个回答

0

你必须创建一个名为 Widget 的变量,并将其添加到 Scaffold 的 Build Context 中。


你能给一个例子吗? - undefined

0
在第一步中,我创建了一个名为CustomTextField的小部件。
import 'package:flutter/material.dart';

class CustomTextField extends StatelessWidget {
final String hint;
final TextEditingController controllers;

CustomTextField(this.hint, this.controllers);

    @override
    Widget build(BuildContext context) {
    return Padding(
        padding: EdgeInsets.only(top: 2.0, left: 6.0, right: 6.0, bottom: 2.0),
        child: Column(
          children: <Widget>[
            TextField(
                decoration: InputDecoration(hintText: hint),
                controller: controllers),
            SizedBox(height: 4.0),
          ],
        ),
      );
    }
}

这个小部件给我一个用于在提示上显示的文本和一个用于控制文本字段的控制器。
接下来,在下一步中,我以这种方式更改主页类 我有一个自定义文本字段(我的小部件)的列表,并使用构建方法的映射列表显示在列表视图上。
import 'package:flutter/material.dart';
import 'CustomTextField.dart';

class PageTutorial extends StatefulWidget {
  @override
  _PageTutorialState createState() => _PageTutorialState();
}

class _PageTutorialState extends State<PageTutorial> {
  List<CustomTextField> widgets = [
    CustomTextField("UserName", TextEditingController())
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView(
        children: widgets.map<Widget>((widget) => widget).toList(),
      ),
      floatingActionButton: FloatingActionButton(
          onPressed: () {
            setState(() {
              widgets.add(CustomTextField("Password", TextEditingController()));
            });
          },
          child: Icon(Icons.add)),
    );
  }
}

玩得开心


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接