Passing a function as parameter in flutter with null safety

6,531

Solution 1

You're passing a Function() value to a void Function() parameter like it says. Change your declaration to `final void Function() onPressed;' so that the typing is a closer match and cannot possibly return a null or take args.

Solution 2

You could have just added the parenthesis to the function declaration like so, Function() the updated code is below.

class AppBarIcon extends StatelessWidget {
  final IconData icon;
  final Function() onPressed;
  const AppBarIcon({Key? key, required this.icon, required this.onPressed}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return CupertinoButton(
      child: Icon(icon, size: 28, color: Colors.white),
      onPressed: onPressed,
    );
  }
}

Solution 3

Use VoidCallback instead of void Function(), and create your own for the ones which isn't defined.

class FooWidget extends StatelessWidget {
  final VoidCallback onPressed; // Required
  final Widget Function(BuildContext context) builder; // Required 
  final VoidCallback? onLongPress; // Optional (nullable)

  FooWidget({
    required this.onPressed, 
    required this.builder, 
    this.onLongPress, 
  });

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: onPressed,
      onLongPress: onLongPress,
      child: builder(context),
    );
  }
}
Share:
6,531
Felix Mittermeier
Author by

Felix Mittermeier

20 years old guy from southern Germany just trying to have a positive impact on the world.

Updated on December 26, 2022

Comments

  • Felix Mittermeier
    Felix Mittermeier over 1 year

    After upgrading to Flutter 1.25.0-8.1.pre null safety is enabled by default and I started to modify the code of my project. Everything is working fine except functions passed as parameters like in the following example:

    class AppBarIcon extends StatelessWidget {
      final IconData icon;
      final Function onPressed;
      const AppBarIcon({Key? key, required this.icon, required this.onPressed}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return CupertinoButton(
          child: Icon(icon, size: 28, color: Colors.white),
          onPressed: onPressed,
        );
      }
    }
    

    onPressed is a required parameter so it cannot be null but nevertheless I get an error when trying to pass the function to the CupertinoButton:

    The argument type 'Function' can't be assigned to the parameter type 'void Function()?'.

    I am already searching quite long for an answer and a possible solution but I haven't found one yet. Any help would be much appreciated.