gpt4 book ai didi

flutter - 如何在 Flutter 中将参数传递给监听器?

转载 作者:行者123 更新时间:2023-12-05 03:57:26 27 4
gpt4 key购买 nike

我是 Flutter 的新手,我正在关注这个关于文本字段的官方示例:https://flutter.dev/docs/cookbook/forms/text-field-changes

有一个示例用于监听文本字段小部件的 Controller 中的变化。请注意这段代码 _MyCustomFormState

final myController = TextEditingController();

@override
void initState() {
super.initState();
myController.addListener(_printLatestValue);
}

_printLatestValue() {
print("Second text field: ${myController.text}");
}

如果我有两个字段和两个 Controller ,我希望只有一个 监听器,并根据调用该方法的 Controller 显示一些消息。我想做这样的事情:

final myController1 = TextEditingController();
final myController2 = TextEditingController();

@override
void initState() {
super.initState();
myController1.addListener(_printLatestValue('message1'));
myController1.addListener(_printLatestValue('message2'));
}

_printLatestValue(message) {
print("Second text field: ${myController.text + message}");
}

这是不可能的,因为方法 addListener() 使用了一些名为 VoidCallback 的方法,它没有参数。至少这是我从 Flutter 文档中了解到的。

那么,如果可能的话,我怎样才能实现我正在寻找的东西?

最佳答案

您几乎是正确的,但不完全正确。您可以自由地将任何参数传递给监听器。但是,这些参数需要来自其他地方 - TextEditingController 不提供任何参数,并且它不期望任何返回值。换句话说,签名应该是这样的:() => listener(...)

因此,为了回答您的问题,您可以自由地执行以下操作来区分 Controller :

  void initState() {
super.initState();
firstController.addListener(() => _printLatestValue('first'));
secondController.addListener(() => _printLatestValue('second'));
}

完整的工作示例:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Text controllers',
home: HomePage(),
);
}
}

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

class _HomePageState extends State<HomePage> {
final firstController = TextEditingController();
final secondController = TextEditingController();


void initState() {
super.initState();
firstController.addListener(() => _printLatestValue('first'));
secondController.addListener(() => _printLatestValue('second'));
}

@override
void dispose() {
firstController.dispose();
secondController.dispose();
super.dispose();
}

_printLatestValue(message) {
if (message == 'first') {
print('Received form first controller: ${firstController.text}');
} else {
print('Received from second controller: ${secondController.text}');
}
}

Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Controllers', style: TextStyle(fontSize: 18)),
),
body: Center(
child: Column(
children: <Widget>[
TextField(controller: firstController,),
TextField(controller: secondController,)
],
),
),
);
}
}

请注意,在这种情况下,监听器只会打印已更改的 TextField 中的文本。

关于flutter - 如何在 Flutter 中将参数传递给监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58498315/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com