Skip to content

Instantly share code, notes, and snippets.

@matanlurey
Created July 13, 2018 23:22
Show Gist options
  • Save matanlurey/9c0b30f65e8cf84d3107bdc8d23c8dcf to your computer and use it in GitHub Desktop.
Save matanlurey/9c0b30f65e8cf84d3107bdc8d23c8dcf to your computer and use it in GitHub Desktop.
An example of my proposal to ban/lint "covariant Function"
void main() {
// [1] Will fail at runtime.
var cell1 = new Cell1();
try {
cell1.registerCallback((String foo) {});
} on TypeError {
print('cell1.registerCallback() failed');
}
// [2] Will fail statically.
var cell2 = new Cell2();
// ERROR: (String) => Null can't be assigned to (dynamic) => void.
cell2.registerCallback((String foo) {});
// [3] User intended (hardest to remember to do).
var cell3 = new Cell3();
cell3.registerCallback((String foo) {});
}
typedef void CellValueChanged<T>(T value);
class Cell1 {
CellValueChanged _valueChanged;
void registerCallback(covariant Function callback) {
_valueChanged = callback;
_valueChanged(null);
}
}
class Cell2 {
CellValueChanged _valueChanged;
void registerCallback(void Function(dynamic) callback) {
_valueChanged = callback;
_valueChanged(null);
}
}
class Cell3 {
CellValueChanged _valueChanged;
void registerCallback<V>(void Function(V) callback) {
_valueChanged = (dynamic value) => callback(value);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment