如何在自定义按钮颤动中给 onPressed 一个方法

Posted

技术标签:

【中文标题】如何在自定义按钮颤动中给 onPressed 一个方法【英文标题】:How to give onPressed a method in custom button flutter 【发布时间】:2018-07-18 09:33:38 【问题描述】:

我有自定义按钮,我想在我的 onpressed 参数中添加方法,不幸的是我仍然卡住我应该在我的自定义按钮参数中使用什么类型,目前我硬编码 onpressed 方法并将字符串路由传递给导航问题不是我的所有按钮都是用来导航的,只有一个按钮可以注销,我已经在参数中使用了 void 但它仍然不起作用。 这是我的自定义按钮

FlatButton buttonMenu(String title, IconData icon, String route) 
    return new FlatButton(
      shape: new RoundedRectangleBorder(
          borderRadius: new BorderRadius.circular(25.0)),
      color: Colors.blueGrey,
      child: new Container(
        height: 50.0,
        width: 120.0,
        child: new Row(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            new Padding(
              padding: EdgeInsets.only(right: 10.0),
              child: new Icon(
                icon,
                color: Colors.white70,
                size: 30.0,
              ),
            ),
            new Text(
              title,
              style: new TextStyle(fontSize: 20.0, fontWeight: FontWeight.w300),
            ),
          ],
        ),
      ),
      onPressed: () 
      Navigator.of(context).pushNamed('/$route');
      ,
    );
  

这是我如何调用自定义按钮

 buttonMenu('MVP Arc', Icons.star, 'EmployeeScreen')

我想要的是我可以将我的参数中的方法发送到我的onpressed,所以它会像这样

buttonMenu('MVP Arc', Icons.star, myMethod())

我的导航方法

void _navigate(String route)
    Navigator.of(context).pushNamed('/$route');
  

【问题讨论】:

【参考方案1】:

onPressed 类型是 VoidCallback,所以将您的参数设为这种类型。

FlatButton buttonMenu(String title, IconData icon, VoidCallback onCustomButtonPressed ) 

当你调用它时传递一个对它的引用

buttonMenu('MVP Arc', Icons.star, myMethod)

别忘了在你的函数体中做同样的事情

  onPressed: onCustomButtonPressed ,

更新: 如果你想传递参数,你必须声明你自己的签名:

你的例子:

typedef VoidNavigate = void  Function(String route);

然后使用这个新类型

FlatButton buttonMenu(String title, IconData icon, VoidNavigate onCustomButtonPressed) 

这样称呼

onPressed: ()onCustomButtonPressed,

然后你像这样传递你的函数

buttonMenu('MVP Arc', Icons.star, _navigate('EmployeeScreen')) 

或者你可以像@Kirill Shashov 所说的那样做

buttonMenu('MVP Arc', Icons.star, () _navigate('EmployeeScreen');)

【讨论】:

我应该在我的方法中使用什么它说这里的表达式有一种'void'类型,因此不能使用。 我更新了我的问题并添加了我的导航方法,我的自定义按钮将如下所示 buttonMenu('MVP Arc', Icons.star, _navigate('EmployeeScreen')) 但有一个错误说不能使用 void @TheodorusAgumGumilang 试试这个:buttonMenu('MVP Arc', Icons.star, () _navigate('EmployeeScreen');) 是的,谢谢我使用它并工作 buttonMenu('MVP Arc', Icons.star, () _navigate('EmployeeScreen');) 抱歉耽搁了@KirillShashov 方式最适合您,但我添加了另一种方式,以便您更好地理解【参考方案2】:

对于传递参数的公认答案似乎不再适用于较新版本的 Flutter。

如果有人搜索类似的问题,下面的修改对我有用。

修改Raouf Rahiche的回答,截至2019年10月28日的工作方法如下。

更新: 在下方添加了缺失的颤振版本号

Flutter 版本:1.9.1+hotfix.5

飞镖版本:2.5.0

使用现有的 typedef:

typedef VoidNavigate = void Function(String route);

使用小方式改变的类型,你必须将参数单独传递给按钮。

FlatButton buttonMenu(
   String title,
   IconData icon, 
   VoidNavigate onCustomButtonPressed, 
   String route //New addition
) 
   ...

现在调用它:

onPressed: ()  onCustomButtonPressed(route); ,

传递函数:

buttonMenu('MVP Arc', Icons.star, _navigate, 'EmployeeScreen') 

【讨论】:

用你的解决方案工作的颤振版本更新你的答案。 (审查结束)。 谢谢ZF007,我忘了补充,已修复。【参考方案3】:

这对我有用:

颤振版本:2.6.0 飞镖版本:2.15.0

在我的 customButton 函数中:

Widget customButton(VoidCallback onPressed) 


....
onPressed : onPressed.call(),

无需其他更改。

【讨论】:

以上是关于如何在自定义按钮颤动中给 onPressed 一个方法的主要内容,如果未能解决你的问题,请参考以下文章

创建一个在颤动中创建小部件的按钮[关闭]

如何在颤动中显示小吃店消息

5秒后closeWebView - 颤动

如何在颤动中制作自定义按钮形状

是否可以在颤动的函数中使用小吃店?

如何在颤动中自定义切换按钮[关闭]