Flutter-创建动态数量的texteditingcontrollers

Mat*_*mpe 5 dynamic dart flutter

我正在重新创建一个以前在Swift中制作的应用程序,在我的其中一个页面上我们调用了API,并根据结果向用户提供了动态数量的文本字段,可通过不同的搜索参数进行搜索。

在Dart / Flutter中有什么好方法吗?由于dart不支持在运行时生成代码,这甚至有可能吗?

Fel*_*lix 6

就像@GünterZöchbauer提到的那样,您可以只构建一个嵌套在容器中的小部件列表。

这是一个简单的例子:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "MyHomePage",
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(
        title: "MyHomePage",
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    var stringListReturnedFromApiCall = ["first", "second", "third", "fourth", "..."];

    // This list of controllers can be used to set and get the text from/to the TextFields
    var textEditingControllers = <TextEditingController>[];

    var textFields = <TextField>[];
    stringListReturnedFromApiCall.forEach((str) {
      var textEditingController = new TextEditingController(text: str);
      textEditingControllers.add(textEditingController);
      return textFields.add(new TextField(controller: textEditingController));
    });

    return Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: SingleChildScrollView(
            child: new Column(
          children: textFields,
        )));
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:增加了列表TextEditingControllers到交互的所有TextField小号


Bil*_*şek 6

我只是使用Map来存储TextEditingControllers而不是list来修改@Felix的答案。我认为使用键值对调用textEditingControllers很容易。修改后的代码块;

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "MyHomePage",
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(
        title: "MyHomePage",
      ),
    );
  }
}
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    var stringListReturnedFromApiCall = ["first", "second", "third", "fourth", "..."];
    // This list of controllers can be used to set and get the text from/to the TextFields
    Map<String,TextEditingController> textEditingControllers = {};
    var textFields = <TextField>[];
    stringListReturnedFromApiCall.forEach((str) {
      var textEditingController = new TextEditingController(text: str);
      textEditingControllers.putIfAbsent(str, ()=>textEditingController);
      return textFields.add( TextField(controller: textEditingController));
    });

    return Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: SingleChildScrollView(
            child: new Column(
              children:[
              Column(children:  textFields),
                RaisedButton(
                  child: Text("Print Values"),
                    onPressed: (){
                    stringListReturnedFromApiCall.forEach((str){
                      print(textEditingControllers[str].text);
                    });
                  })
              ]
            )));
  }
}
Run Code Online (Sandbox Code Playgroud)

当您在文本字段中写东西并点击打印按钮结果时;

flutter: first controller text
flutter: second controller text
flutter: third controller text
flutter: fourth controller text
flutter: so on .......
Run Code Online (Sandbox Code Playgroud)

  • @override void dispose() { textEditingControllers.forEach((_,v){ v.dispose(); }); 超级.dispose(); } (2认同)

Abd*_*rek 6

使用文本编辑控制器列表而不是地图

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  var stringListReturnedFromApiCall = ["first", "second", "third", "fourth", "..."];
  List<TextEditingController> textEditingControllers = [];

  @override
  void initState() {
    super.initState();
    stringListReturnedFromApiCall.forEach((String str) {
      var textEditingController = TextEditingController(text: str);
      textEditingControllers.add(textEditingController);
    });
  }

  @override
  void dispose() {
    super.dispose();
    // dispose textEditingControllers to prevent memory leaks
    for (TextEditingController textEditingController in textEditingControllers) {
      textEditingController?.dispose();
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('title'),
      ),
      body: ListView.builder(
        itemCount: stringListReturnedFromApiCall.length,
        itemBuilder: (BuildContext context, int index) {
          return Padding(
            padding: const EdgeInsets.all(10.0),
            child: TextField(
              controller: textEditingControllers[index],
            ),
          );
        },
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)