首页 > 解决方案 > 如何使用回调方法在 Flutter 中获取按钮的文本?

问题描述

我刚开始使用 Flutter,我正在制作一个计算器。我想为我的按钮设置不同的回调方法来执行各种操作。问题是,我想获取单击按钮的文本以知道我应该做什么操作,但回调方法似乎不包含“发送者小部件”的任何信息。

在 C# 中,我可以执行下一个操作,其中“发送者”是被单击的按钮。

var button1 = new Button();
var button2 = new Button();

public MyClassConstructor() {
    button1.Clicked += foo;
    button2.Clicked += foo;
}

public void foo (object sender, EventArgs e)
{
    var button = sender as Button;
    string id = button.ID;

    if (id == "1")
    {
        // do something
    }
    else if (id == "2")
    {
        // do something else
    }
    ...
}

同样,在 Java 中,“事件”包含单击的按钮。

private JButton button1 = new JButton("1");
private JButton button2 = new JButton("2");

public MyClassConstructor() {
    Listener listener = new Listener();
    button1.addActionListener(listener);
    button2.addActionListener(listener);
}

private class Listener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent event) {
        if (event.getSource().equals(button1)) {
            // do something
        } else if (event.getSource().equals(button2)) {
            // do something else
        }
        ...
    }
}

Flutter中有类似的东西吗?我知道我可以做到以下几点:

VoidCallback foo = () {
  // do something
};

var button1 = RaisedButton(
  onPressed: foo,
  child: Text("1"),
);

var button2 = RaisedButton(
  onPressed: foo,
  child: Text("2"),
);

但问题是我无法获取按下的按钮,因为 Flutter 的 RaisedButton 小部件的“onPressed”定义是一个 VoidCallback,它不接收任何参数。是否有解决方法,或者有其他方法吗?

标签: flutterdartbuttoncallback

解决方案


用一个小部件包裹DownloadButton’s现有的小部件树GestureDetector,并将点击事件转发到相应的回调属性。

@immutable
class DownloadButton extends StatefulWidget {
 const DownloadButton({
   Key? key,
   required this.onDownload,
   required this.onCancel,
   required this.onOpen,
 }) : super(key: key);

 final VoidCallback onDownload;
 final VoidCallback onCancel;
 final VoidCallback onOpen;

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

class _DownloadButtonState extends State<DownloadButton> {
 void _onPressed() {
   switch (widget.status) {
     case DownloadStatus.notDownloaded:
       widget.onDownload();
       break;
     case DownloadStatus.fetchingDownload:
       // do nothing.
       break;
     case DownloadStatus.downloading:
       widget.onCancel();
       break;
     case DownloadStatus.downloaded:
       widget.onOpen();
       break;
   }
 }

 @override
 Widget build(BuildContext context) {
   return GestureDetector(
     onTap: _onPressed,
     child: Stack(
       children: [
         _buildButtonShape(
           child: _buildText(),
         ),
         _buildDownloadingProgress(),
       ],
     ),
   );
 }
}

你可以在这里找到完整的例子:https ://docs.flutter.dev/cookbook/effects/download-button#interactive-example


推荐阅读