flutter - 如何使用回调方法在 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,它不接收任何参数。是否有解决方法,或者有其他方法吗?
解决方案
用一个小部件包裹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
推荐阅读
- r - 使用 ggplot2 绘制时间序列图
- python - 如何使用正则表达式在 Python 中的目录中查找文件名
- apache-spark - Spark加入两个大表并存储在Hive中
- android - VTS 套件因异常而无法运行
- spring-boot - 使用 Spring Cloud DataFlow 在无限运行的应用程序中编排长时间运行的外部批处理作业是否合适?
- c++ - 检测网络接口变化
- sql - SQL在ORACLE中只用in子句更新一行
- c# - 意外的 XML 声明。XML 声明必须是文档中的第一个节点
- json - 使用 jq 进行大小写转换时出现错误“爆炸输入必须是字符串”
- php - 安装 Bitexchange 脚本时在浏览器中获取 PHP 代码