使用按钮添加动态小部件

时间:2020-08-05 06:26:40

标签: android flutter dart mobile cross-platform

当我尝试向应用程序中添加动态窗口小部件时,我遇到了一个奇怪的错误。当按下添加按钮屏幕变成完全白色时,我找不到原因。 我使用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();
              },
            ),
          ],
        ));
 

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您必须创建变量Widget并将其添加到Scaffold上的Build Context

答案 1 :(得分: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),
          ],
        ),
      );
    }
}

此小部件给了我一个用于显示在提示上的文本和一个用于控制文本字段的控制器

然后在下一步中,我以这种方式更改主页类 我有Custom TextField(我的窗口小部件)列表,并使用构建方法的映射列表显示在listview上

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)),
    );
  }
}

玩得开心