繁体   English   中英

如何将参数传递给 Flutter 中的侦听器?

[英]How can I pass parameters to listeners in Flutter?

我是 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 显示一些消息。 我想做这样的事情:

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的方法,它们没有 arguments。 至少这是我从 Flutter 文档中了解到的。

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

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

因此,要回答您的问题,您可以自由地执行以下操作来区分控制器:

  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中的文本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM