如何在flutter中将功能作为参数传递

时间:2019-09-12 12:34:11

标签: flutter

我正在制作一个全局组件文件,在其中制作一些我想在整个应用程序中使用的通用小部件。

但是我停留在要使用按钮的位置,而我正在使用材质的按钮,因此我想将“类别名称”传递给Route,我要使用该按钮进行重定向。

我不知道如何通过

这是Global.dart,我在其中制作了一个btn小部件以在全球使用它。

    class Proceedbtn extends StatelessWidget {
    final String Btntext;
    final String redirecto;

    Proceedbtn({this.Btntext, this.redirecto});

      @override
      Widget build(BuildContext context) {
      return Material(
      elevation: 1.0,
      borderRadius: BorderRadius.circular(30.0),
      color: Colors.butonColor,
      child: MaterialButton(
        height: 5,
        minWidth: MediaQuery
            .of(context)
            .size
            .width,
        padding: EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 0.0),
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => redirecto()),
          );
        }
      ));
   }

 }

这是我要使用proce btn小部件的页面

class UseProceedBtn extends StatefulWidget {
   _UseProceedBtnState createState() => _UseProceedBtnState();
 }

class _UseProceedBtnState extends State<UseProceedBtn> {

   @override
   Widget build(BuildContext context) {
   return Container(
    child: Proceedbtn('Proceed next','NextPage');
  )

这是NextPage.dart

  class NextPage extends StatefulWidget {
      _NextPageState createState() => _NextPageState();
   }

 class _NextPageState extends State<NextPage> {

  @override
    Widget build(BuildContext context) {
     return Container(
       child: Text('this is Next Page')
       )
  }
}

2 个答案:

答案 0 :(得分:2)

您可以使用另一种方法:

class Proceedbtn extends StatelessWidget {
    final String Btntext;
    final Widget Function() redirecto;

    Proceedbtn({this.Btntext, this.redirecto});

/* ... */
Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => redirecto()),
          );

然后

Proceedbtn(Btntext: "proceed next",redirecto: ()=> NextPage())

答案 1 :(得分:1)

您需要使用Function类,例如Andrey Turkovsky所说的:

    class Proceedbtn extends StatelessWidget {
       final String btntext;
       final Function onPressed;  //the function here

       Proceedbtn({this.btntext, this.onPressed});

       @override
       Widget build(BuildContext context) {
          return Material(
          elevation: 1.0,
          borderRadius: BorderRadius.circular(30.0),
          color: Colors.butonColor,
          child: MaterialButton(
              height: 5,
              minWidth: MediaQuery
               .of(context)
               .size
               .width,
               padding: EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 0.0),
               onPressed: onPressed, //receive here
        ));
     }

  }

然后,通过此处:

   class UseProceedBtn extends StatefulWidget {
        _UseProceedBtnState createState() => _UseProceedBtnState();
   }

   class _UseProceedBtnState extends State<UseProceedBtn> {

       @override
       Widget build(BuildContext context) {
       return Container(
           child: Proceedbtn(btntext: 'Proceed next', onPressed: () {
           Navigator.push(
           context,
           MaterialPageRoute(builder: (context) => NextPage()),
         );
       }),
    );}}