簡體   English   中英

如何將 function 作為小部件中的參數傳遞?

[英]How to pass a function as a parameter in widget?

我創建了一個小部件,我想將 function 傳遞給這個小部件,但是當我嘗試這樣做時,我得到了這個錯誤。 在此處輸入圖像描述

此外,當將此 function 傳遞給小部件時,它會自動使用,因為它調試打印“MONEY CHANGED”。

這是 function 代碼:

class Functions {
  changeMoney(int money) {
    Boxes.getCharacter().get(0)!.money =
        Boxes.getCharacter().get(0)!.money + money;
    debugPrint("MONEY CHANGED");
  }
}

這是小部件的代碼:

class DialogButton extends StatefulWidget {
  const DialogButton(
      {Key? key,
      required this.answer,
      required this.function,
      required this.possible})
      : super(key: key);
  final String answer;
  final Function function;
  final bool possible;

  @override
  State<DialogButton> createState() => _DialogButtonState();
}

class _DialogButtonState extends State<DialogButton> {
  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.symmetric(vertical: 6),
      child: ElevatedButton(
          onPressed: () => {
                Navigator.of(context, rootNavigator: true).pop(),
                widget.function
              },
          child: Padding(
            padding: const EdgeInsets.symmetric(vertical: 18.0),
            child: Row(children: [
              Expanded(child: Container()),
              Text(
                widget.answer,
                style: rajdhaniStyle(weight: FontWeight.w600, size: 18),
              ),
              Expanded(child: Container()),
            ]),
          )),
    );
  }
}

所以問題是我應該如何在小部件內部正確傳遞 function 而不會自動打開 function 並且不會出錯?

如果 function 有參數,那么接收到的小部件(這里是DialogButton )也需要聲明參數類型。 例如,function 是: void doSomething(String hehe, int yolo) {} 然后你的DialogButton應該被聲明為Function(String, int) onTap

更多詳細信息,在第一個屏幕中,您可以像這樣調用DialogButton

class Screen1 extends StatelessWidget {
  @override
  build(...) {
    // do something
      DialogButton(
        answer: "your answer",
        function: (double money) {},
        possible: true,
      )
  }
}

否則,如果您想拆分/分離 function(不是像上面那樣直接寫入),您可以執行以下操作:

class Screen1 extends StatelessWidget {
  @override
  build(...) {
    // do something
      DialogButton(
        answer: "your answer",
        function: myFunction,
        possible: true,
      )
  }
  
  myFunction(double money) {}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM