如何在自定义按钮颤抖中给onPressed方法

The*_*ang 0 dart material-design flutter

我有自定义按钮,但我想从我的参数中添加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');
      },
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

这就是我叫自定义按钮的方式

 buttonMenu('MVP Arc', Icons.star, 'EmployeeScreen')
Run Code Online (Sandbox Code Playgroud)

我想要的是我可以将参数中的方法发送给我的onpressed,因此它将像这样

buttonMenu('MVP Arc', Icons.star, myMethod())
Run Code Online (Sandbox Code Playgroud)

我的导航方法

void _navigate(String route){
    Navigator.of(context).pushNamed('/$route');
  }
Run Code Online (Sandbox Code Playgroud)

Rao*_*che 5

onPressed类型是VoidCallback这样会让你的参数这样的这一类。

FlatButton buttonMenu(String title, IconData icon, VoidCallback onCustomButtonPressed ) 
Run Code Online (Sandbox Code Playgroud)

当您调用它时,传递对它的引用

buttonMenu('MVP Arc', Icons.star, myMethod)
Run Code Online (Sandbox Code Playgroud)

并且不要忘记在功能体内做同样的事情

  onPressed: onCustomButtonPressed ,
Run Code Online (Sandbox Code Playgroud)

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

您的例子:

typedef VoidNavigate = void  Function(String route);
Run Code Online (Sandbox Code Playgroud)

然后使用这种新类型

FlatButton buttonMenu(String title, IconData icon, VoidNavigate onCustomButtonPressed) 
Run Code Online (Sandbox Code Playgroud)

这样称呼它

onPressed: (){onCustomButtonPressed},
Run Code Online (Sandbox Code Playgroud)

然后通过这样的功能

buttonMenu('MVP Arc', Icons.star, _navigate('EmployeeScreen')) 
Run Code Online (Sandbox Code Playgroud)

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

buttonMenu('MVP Arc', Icons.star, () {_navigate('EmployeeScreen');})
Run Code Online (Sandbox Code Playgroud)