0

我希望页面显示社交媒体应用程序列表,用户可以在其中输入他们的用户名/详细信息。我希望能够提取此输入数据以及应用程序名称和徽标(最好作为 JSON 文件),以便能够将它们创建为通向相应应用程序和配置文件的按钮。

为此,我使用 listview.builder 创建了一个 List Tiles 列表(来自一个单独的列表,其中包含我想要包含的应用程序和徽标的列表),并使用 subtitle 函数向每个 List Tile 添加了一个 TextField。

请您能帮我将文本编辑控制器添加到列表的每个项目中,并提取一个包含文本输入、应用程序名称和徽标的文件。

请注意:应用列表是一个包含应用名称、TextField 提示文本和徽标图像的列表。

import 'package:flutter/material.dart';
import 'package:applist/apps.dart';

class AppList extends StatefulWidget {
  const AppList({Key? key}) : super(key: key);

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

class _AppListState extends State<AppList> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('My list of apps'),
      ),
      body: Padding(
        padding: EdgeInsets.all(20.0),
        child: Column(
          children: [
            Expanded(
                child: ListView.builder(
                    itemCount: apps.length,
                    itemBuilder: (BuildContext context, int index) {
                      return ListTile(
                        title: Text(apps[index].appname),
                        leading: SizedBox(
                          height: 50,
                          width: 50,
                          child: Image.asset(apps[index].image),
                        ),
                        subtitle: TextField(
                          decoration:
                              InputDecoration(hintText: (apps[index].hint)),
                        ),
                      );
                    }))
          ],
        ),
      ),
    );
  }
}
4

3 回答 3

1

1-您需要定义TextEditingConrtoller字段变量:

late  TextEditingController textEditingController ; 

2-初始化字段变量initState

  @override
  void initState(){
    super.initState();
    textEditingController = TextEditingController();
  }

3-然后初始化你TextField的控制器

TextField(
   controller:textEditingController ,
)
  • 你的最终代码应该是这样的
import 'package:flutter/material.dart';
import 'package:applist/apps.dart';

class AppList extends StatefulWidget {
  const AppList({Key? key}) : super(key: key);

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

class _AppListState extends State<AppList> {
late  TextEditingController textEditingController ;   // <--
@override
  void initState() {
    super.initState();
    textEditingController = TextEditingController(); // <--
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('My list of apps'),
      ),
      body: Padding(
        padding: EdgeInsets.all(20.0),
        child: Column(
          children: [
            Expanded(
                child: ListView.builder(
                    itemCount: apps.length,
                    itemBuilder: (BuildContext context, int index) {
                      return ListTile(
                        title: Text(apps[index].appname),
                        leading: SizedBox(
                          height: 50,
                          width: 50,
                          child: Image.asset(apps[index].image),
                        ),
                        subtitle: TextField(
                          controller:textEditingController , // <--
                          decoration:
                              InputDecoration(hintText: (apps[index].hint)),
                        ),
                      );
                    }))
          ],
        ),
      ),
    );
  }
}
于 2021-07-08T17:25:08.120 回答
0

如果您想对文本字段使用唯一的控制器。您应该使用具有控制器和其他数据的模型。使用“冻结”的模型示例

import 'package:flutter/material.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'controller_model.freezed.dart';

@freezed
class ControllerModel with _$ControllerModel {
  const factory ControllerModel({
    required String name,
    required TextEditingController controller,
  }) = _ControllerModel;
}
于 2021-10-04T06:48:05.883 回答
0

让每个应用程序都有一个唯一的 id(如果只有应用程序名称不是唯一的)。

创建 TextEditingController 的映射

Map<String, TextEditingController> _textControllers = new Map();

为每个应用程序添加一个新的 TextEditingController ,并以其唯一的名称或 id作为键

apps.forEach((app) => textControllers[app.id] = new TextEditingController());

最后,您可以像这样在 ListViewBuilder 中使用它。

ListView.builder(
          itemCount: apps.length,
          itemBuilder: (context, index) => TextFormField(
            controller: _textControllers[apps[index].id],
          ),
        )
于 2021-07-08T17:42:21.970 回答