Home > other >  'Future<bool> Function()' can't be assigned to the parameter type 'Future&
'Future<bool> Function()' can't be assigned to the parameter type 'Future&

Time:08-13

I'm trying to implement an event callback directly in the constructor, but for some reason it does not compile and I do not understand what's the issue with my code.

abstract class Base {
  final Future<bool>? onMagic;
  Base({
    this.onMagic
  });
  
  Future<void> doSomething() async {
    if(onMagic != null) {
      // does not work... why?
      // final useMagic = await onMagic!();
      onMagic?.then((magic) {
        if(magic) print("TODO make something magical");
      });
    }
  }
}

class RealMagic extends Base {
  RealMagic() : super(
    // Error: The argument type 'Future<bool> Function()' can't be assigned to the parameter type 'Future<bool>?'.
    onMagic: () async => await _magic();
  );

  Future<bool> _magic() async {
    return true;
  } 
}

I inlined the error above. If that's not possible which alternatives do I have to handle the optional callback?

CodePudding user response:

The problem is with the type of the onMagic. It's not a Future<bool>, it should be a Future<bool> Function()?

abstract class Base {
  final Future<bool> Function()? onMagic;
  Base({this.onMagic});

  Future<void> doSomething() async {
    onMagic?.call().then((magic) {
      if (magic) print("TODO make something magical");
    });
  }
}

class RealMagic extends Base {
  RealMagic()
      : super(
          onMagic: () async => await _magic(),
        );

  static Future<bool> _magic() async { // Made this static so it can be accessed in the constructor
    return true;
  }
}
  • Related