Revert "Revert some changes since the latest published (#167)" (#170)

This reverts commit 5aae0d58d334bd329442e832ca5f7cfe5c04dd4e.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f990411..d8a3dd1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.12.11-dev
+
+* Change many argument types from `dynamic` to `Object?`.
+
 ## 0.12.10
 
 * Stable release for null safety.
diff --git a/lib/mirror_matchers.dart b/lib/mirror_matchers.dart
index 4aaf5ad..9327eba 100644
--- a/lib/mirror_matchers.dart
+++ b/lib/mirror_matchers.dart
@@ -14,7 +14,7 @@
 /// Returns a matcher that checks if a class instance has a property
 /// with name [name], and optionally, if that property in turn satisfies
 /// a [matcher].
-Matcher hasProperty(String name, [matcher]) =>
+Matcher hasProperty(String name, [Object? matcher]) =>
     _HasProperty(name, matcher == null ? null : wrapMatcher(matcher));
 
 class _HasProperty extends Matcher {
@@ -24,7 +24,7 @@
   const _HasProperty(this._name, [this._matcher]);
 
   @override
-  bool matches(item, Map matchState) {
+  bool matches(Object? item, Map matchState) {
     var mirror = reflect(item);
     var classMirror = mirror.type;
     var symbol = Symbol(_name);
@@ -63,8 +63,8 @@
   }
 
   @override
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
+  Description describeMismatch(Object? item, Description mismatchDescription,
+      Map matchState, bool verbose) {
     var reason = matchState['reason'];
     if (reason != null) {
       mismatchDescription.add(reason as String);
diff --git a/lib/src/core_matchers.dart b/lib/src/core_matchers.dart
index c049109..42fc2df 100644
--- a/lib/src/core_matchers.dart
+++ b/lib/src/core_matchers.dart
@@ -14,7 +14,7 @@
   const _Empty();
 
   @override
-  bool matches(item, Map matchState) => item.isEmpty;
+  bool matches(Object? item, Map matchState) => (item as dynamic).isEmpty;
 
   @override
   Description describe(Description description) => description.add('empty');
@@ -27,7 +27,7 @@
   const _NotEmpty();
 
   @override
-  bool matches(item, Map matchState) => item.isNotEmpty;
+  bool matches(Object? item, Map matchState) => (item as dynamic).isNotEmpty;
 
   @override
   Description describe(Description description) => description.add('non-empty');
@@ -42,7 +42,7 @@
 class _IsNull extends Matcher {
   const _IsNull();
   @override
-  bool matches(item, Map matchState) => item == null;
+  bool matches(Object? item, Map matchState) => item == null;
   @override
   Description describe(Description description) => description.add('null');
 }
@@ -50,7 +50,7 @@
 class _IsNotNull extends Matcher {
   const _IsNotNull();
   @override
-  bool matches(item, Map matchState) => item != null;
+  bool matches(Object? item, Map matchState) => item != null;
   @override
   Description describe(Description description) => description.add('not null');
 }
@@ -64,7 +64,7 @@
 class _IsTrue extends Matcher {
   const _IsTrue();
   @override
-  bool matches(item, Map matchState) => item == true;
+  bool matches(Object? item, Map matchState) => item == true;
   @override
   Description describe(Description description) => description.add('true');
 }
@@ -72,7 +72,7 @@
 class _IsFalse extends Matcher {
   const _IsFalse();
   @override
-  bool matches(item, Map matchState) => item == false;
+  bool matches(Object? item, Map matchState) => item == false;
   @override
   Description describe(Description description) => description.add('false');
 }
@@ -103,13 +103,13 @@
 
 /// Returns a matches that matches if the value is the same instance
 /// as [expected], using [identical].
-Matcher same(expected) => _IsSameAs(expected);
+Matcher same(Object? expected) => _IsSameAs(expected);
 
 class _IsSameAs extends Matcher {
   final Object? _expected;
   const _IsSameAs(this._expected);
   @override
-  bool matches(item, Map matchState) => identical(item, _expected);
+  bool matches(Object? item, Map matchState) => identical(item, _expected);
   // If all types were hashable we could show a hash here.
   @override
   Description describe(Description description) =>
@@ -122,7 +122,7 @@
 class _IsAnything extends Matcher {
   const _IsAnything();
   @override
-  bool matches(item, Map matchState) => true;
+  bool matches(Object? item, Map matchState) => true;
   @override
   Description describe(Description description) => description.add('anything');
 }
@@ -181,24 +181,20 @@
 
 /// Returns a matcher that matches if an object has a length property
 /// that matches [matcher].
-Matcher hasLength(matcher) => _HasLength(wrapMatcher(matcher));
+Matcher hasLength(Object? matcher) => _HasLength(wrapMatcher(matcher));
 
 class _HasLength extends Matcher {
   final Matcher _matcher;
   const _HasLength(this._matcher);
 
   @override
-  bool matches(item, Map matchState) {
+  bool matches(Object? item, Map matchState) {
     try {
-      // This is harmless code that will throw if no length property
-      // but subtle enough that an optimizer shouldn't strip it out.
-      if (item.length * item.length >= 0) {
-        return _matcher.matches(item.length, matchState);
-      }
+      final length = (item as dynamic).length;
+      return _matcher.matches(length, matchState);
     } catch (e) {
       return false;
     }
-    throw UnsupportedError('Should never get here');
   }
 
   @override
@@ -206,20 +202,14 @@
       description.add('an object with length of ').addDescriptionOf(_matcher);
 
   @override
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
+  Description describeMismatch(Object? item, Description mismatchDescription,
+      Map matchState, bool verbose) {
     try {
-      // We want to generate a different description if there is no length
-      // property; we use the same trick as in matches().
-      if (item.length * item.length >= 0) {
-        return mismatchDescription
-            .add('has length of ')
-            .addDescriptionOf(item.length);
-      }
+      final length = (item as dynamic).length;
+      return mismatchDescription.add('has length of ').addDescriptionOf(length);
     } catch (e) {
       return mismatchDescription.add('has no length property');
     }
-    throw UnsupportedError('Should never get here');
   }
 }
 
@@ -230,7 +220,7 @@
 /// for [Map]s it means the map has the key, and for [Iterable]s
 /// it means the iterable has a matching element. In the case of iterables,
 /// [expected] can itself be a matcher.
-Matcher contains(expected) => _Contains(expected);
+Matcher contains(Object? expected) => _Contains(expected);
 
 class _Contains extends Matcher {
   final Object? _expected;
@@ -238,7 +228,7 @@
   const _Contains(this._expected);
 
   @override
-  bool matches(item, Map matchState) {
+  bool matches(Object? item, Map matchState) {
     var expected = _expected;
     if (item is String) {
       return expected is Pattern && item.contains(expected);
@@ -259,8 +249,8 @@
       description.add('contains ').addDescriptionOf(_expected);
 
   @override
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
+  Description describeMismatch(Object? item, Description mismatchDescription,
+      Map matchState, bool verbose) {
     if (item is String || item is Iterable || item is Map) {
       return super
           .describeMismatch(item, mismatchDescription, matchState, verbose);
@@ -272,7 +262,7 @@
 
 /// Returns a matcher that matches if the match argument is in
 /// the expected value. This is the converse of [contains].
-Matcher isIn(expected) {
+Matcher isIn(Object? expected) {
   if (expected is Iterable) {
     return _In(expected, expected.contains);
   } else if (expected is String) {
diff --git a/lib/src/custom_matcher.dart b/lib/src/custom_matcher.dart
index f7581a9..4fd53e0 100644
--- a/lib/src/custom_matcher.dart
+++ b/lib/src/custom_matcher.dart
@@ -35,14 +35,15 @@
   final String _featureName;
   final Matcher _matcher;
 
-  CustomMatcher(this._featureDescription, this._featureName, matcher)
-      : _matcher = wrapMatcher(matcher);
+  CustomMatcher(
+      this._featureDescription, this._featureName, Object? valueOrMatcher)
+      : _matcher = wrapMatcher(valueOrMatcher);
 
   /// Override this to extract the interesting feature.
-  Object? featureValueOf(actual) => actual;
+  Object? featureValueOf(dynamic actual) => actual;
 
   @override
-  bool matches(item, Map matchState) {
+  bool matches(Object? item, Map matchState) {
     try {
       var f = featureValueOf(item);
       if (_matcher.matches(f, matchState)) return true;
@@ -68,8 +69,8 @@
       description.add(_featureDescription).add(' ').addDescriptionOf(_matcher);
 
   @override
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
+  Description describeMismatch(Object? item, Description mismatchDescription,
+      Map matchState, bool verbose) {
     if (matchState['custom.exception'] != null) {
       mismatchDescription
           .add('threw ')
diff --git a/lib/src/description.dart b/lib/src/description.dart
index 6e83c49..090aada 100644
--- a/lib/src/description.dart
+++ b/lib/src/description.dart
@@ -42,7 +42,7 @@
   /// escaping any embedded control characters; otherwise use its
   /// toString() value and wrap it in angular "quotes".
   @override
-  Description addDescriptionOf(value) {
+  Description addDescriptionOf(Object? value) {
     if (value is Matcher) {
       value.describe(this);
     } else {
diff --git a/lib/src/equals_matcher.dart b/lib/src/equals_matcher.dart
index c7b859a..5c5fdce 100644
--- a/lib/src/equals_matcher.dart
+++ b/lib/src/equals_matcher.dart
@@ -15,7 +15,7 @@
 /// For [Iterable]s and [Map]s, this will recursively match the elements. To
 /// handle cyclic structures a recursion depth [limit] can be provided. The
 /// default limit is 100. [Set]s will be compared order-independently.
-Matcher equals(expected, [int limit = 100]) => expected is String
+Matcher equals(Object? expected, [int limit = 100]) => expected is String
     ? _StringEqualsMatcher(expected)
     : _DeepMatcher(expected, limit);
 
@@ -267,8 +267,8 @@
       description.addDescriptionOf(_expected);
 
   @override
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
+  Description describeMismatch(Object? item, Description mismatchDescription,
+      Map matchState, bool verbose) {
     var mismatch = matchState['mismatch'] as _Mismatch;
     var describeProblem = mismatch.describeProblem;
     if (mismatch.location.isNotEmpty) {
diff --git a/lib/src/feature_matcher.dart b/lib/src/feature_matcher.dart
index 8265f14..7a42d87 100644
--- a/lib/src/feature_matcher.dart
+++ b/lib/src/feature_matcher.dart
@@ -18,8 +18,8 @@
   bool typedMatches(T item, Map matchState);
 
   @override
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
+  Description describeMismatch(Object? item, Description mismatchDescription,
+      Map matchState, bool verbose) {
     if (item is T) {
       return describeTypedMismatch(
           item, mismatchDescription, matchState, verbose);
diff --git a/lib/src/having_matcher.dart b/lib/src/having_matcher.dart
index fb8a0b2..4c19019 100644
--- a/lib/src/having_matcher.dart
+++ b/lib/src/having_matcher.dart
@@ -39,8 +39,8 @@
   }
 
   @override
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
+  Description describeMismatch(Object? item, Description mismatchDescription,
+      Map matchState, bool verbose) {
     var matcher = matchState['matcher'] as Matcher;
     matcher.describeMismatch(
         item, mismatchDescription, matchState['state'] as Map, verbose);
@@ -56,9 +56,9 @@
 }
 
 class _FunctionMatcher<T> extends CustomMatcher {
-  final dynamic Function(T value) _feature;
+  final Object? Function(T value) _feature;
 
-  _FunctionMatcher(String name, this._feature, matcher)
+  _FunctionMatcher(String name, this._feature, Object? matcher)
       : super('`$name`:', '`$name`', matcher);
 
   @override
diff --git a/lib/src/interfaces.dart b/lib/src/interfaces.dart
index 1f39fa4..24527f7 100644
--- a/lib/src/interfaces.dart
+++ b/lib/src/interfaces.dart
@@ -18,7 +18,7 @@
   Description add(String text);
 
   /// This is used to add a meaningful description of a value.
-  Description addDescriptionOf(value);
+  Description addDescriptionOf(Object? value);
 
   /// This is used to add a description of an [Iterable] [list],
   /// with appropriate [start] and [end] markers and inter-element [separator].
@@ -39,7 +39,7 @@
   /// [item] is the actual value. [matchState] can be supplied
   /// and may be used to add details about the mismatch that are too
   /// costly to determine in [describeMismatch].
-  bool matches(item, Map matchState);
+  bool matches(dynamic item, Map matchState);
 
   /// Builds a textual description of the matcher.
   Description describe(Description description);
@@ -54,7 +54,7 @@
   /// A few matchers make use of the [verbose] flag to provide detailed
   /// information that is not typically included but can be of help in
   /// diagnosing failures, such as stack traces.
-  Description describeMismatch(item, Description mismatchDescription,
+  Description describeMismatch(dynamic item, Description mismatchDescription,
           Map matchState, bool verbose) =>
       mismatchDescription;
 }
diff --git a/lib/src/iterable_matchers.dart b/lib/src/iterable_matchers.dart
index 1e444a6..1ae9f17 100644
--- a/lib/src/iterable_matchers.dart
+++ b/lib/src/iterable_matchers.dart
@@ -9,8 +9,9 @@
 import 'util.dart';
 
 /// Returns a matcher which matches [Iterable]s in which all elements
-/// match the given [matcher].
-Matcher everyElement(matcher) => _EveryElement(wrapMatcher(matcher));
+/// match the given [valueOrMatcher].
+Matcher everyElement(Object? valueOrMatcher) =>
+    _EveryElement(wrapMatcher(valueOrMatcher));
 
 class _EveryElement extends _IterableMatcher {
   final Matcher _matcher;
@@ -62,8 +63,9 @@
 }
 
 /// Returns a matcher which matches [Iterable]s in which at least one
-/// element matches the given [matcher].
-Matcher anyElement(matcher) => _AnyElement(wrapMatcher(matcher));
+/// element matches the given [valueOrMatcher].
+Matcher anyElement(Object? valueOrMatcher) =>
+    _AnyElement(wrapMatcher(valueOrMatcher));
 
 class _AnyElement extends _IterableMatcher {
   final Matcher _matcher;
diff --git a/lib/src/map_matchers.dart b/lib/src/map_matchers.dart
index ed1738c..97be1ea 100644
--- a/lib/src/map_matchers.dart
+++ b/lib/src/map_matchers.dart
@@ -6,7 +6,7 @@
 import 'util.dart';
 
 /// Returns a matcher which matches maps containing the given [value].
-Matcher containsValue(value) => _ContainsValue(value);
+Matcher containsValue(Object? value) => _ContainsValue(value);
 
 class _ContainsValue extends Matcher {
   final Object? _value;
@@ -14,15 +14,17 @@
   const _ContainsValue(this._value);
 
   @override
-  bool matches(item, Map matchState) => item.containsValue(_value);
+  bool matches(Object? item, Map matchState) =>
+      (item as dynamic).containsValue(_value);
   @override
   Description describe(Description description) =>
       description.add('contains value ').addDescriptionOf(_value);
 }
 
 /// Returns a matcher which matches maps containing the key-value pair
-/// with [key] => [value].
-Matcher containsPair(key, value) => _ContainsMapping(key, wrapMatcher(value));
+/// with [key] => [valueOrMatcher].
+Matcher containsPair(Object? key, Object? valueOrMatcher) =>
+    _ContainsMapping(key, wrapMatcher(valueOrMatcher));
 
 class _ContainsMapping extends Matcher {
   final Object? _key;
@@ -31,8 +33,9 @@
   const _ContainsMapping(this._key, this._valueMatcher);
 
   @override
-  bool matches(item, Map matchState) =>
-      item.containsKey(_key) && _valueMatcher.matches(item[_key], matchState);
+  bool matches(Object? item, Map matchState) =>
+      (item as dynamic).containsKey(_key) &&
+      _valueMatcher.matches(item[_key], matchState);
 
   @override
   Description describe(Description description) {
@@ -44,9 +47,9 @@
   }
 
   @override
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    if (!item.containsKey(_key)) {
+  Description describeMismatch(Object? item, Description mismatchDescription,
+      Map matchState, bool verbose) {
+    if (!(item as dynamic).containsKey(_key)) {
       return mismatchDescription
           .add(" doesn't contain key ")
           .addDescriptionOf(_key);
diff --git a/lib/src/operator_matchers.dart b/lib/src/operator_matchers.dart
index 5f61781..e532fd3 100644
--- a/lib/src/operator_matchers.dart
+++ b/lib/src/operator_matchers.dart
@@ -5,8 +5,8 @@
 import 'interfaces.dart';
 import 'util.dart';
 
-/// This returns a matcher that inverts [matcher] to its logical negation.
-Matcher isNot(matcher) => _IsNot(wrapMatcher(matcher));
+/// Returns a matcher that inverts [valueOrMatcher] to its logical negation.
+Matcher isNot(Object? valueOrMatcher) => _IsNot(wrapMatcher(valueOrMatcher));
 
 class _IsNot extends Matcher {
   final Matcher _matcher;
@@ -27,7 +27,13 @@
 /// Instead of passing the matchers separately they can be passed as a single
 /// List argument. Any argument that is not a matcher is implicitly wrapped in a
 /// Matcher to check for equality.
-Matcher allOf(arg0, [arg1, arg2, arg3, arg4, arg5, arg6]) {
+Matcher allOf(Object? arg0,
+    [Object? arg1,
+    Object? arg2,
+    Object? arg3,
+    Object? arg4,
+    Object? arg5,
+    Object? arg6]) {
   return _AllOf(_wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6));
 }
 
@@ -71,7 +77,13 @@
 ///
 /// Any argument that is not a matcher is implicitly wrapped in a
 /// Matcher to check for equality.
-Matcher anyOf(arg0, [arg1, arg2, arg3, arg4, arg5, arg6]) {
+Matcher anyOf(Object? arg0,
+    [Object? arg1,
+    Object? arg2,
+    Object? arg3,
+    Object? arg4,
+    Object? arg5,
+    Object? arg6]) {
   return _AnyOf(_wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6));
 }
 
@@ -95,7 +107,8 @@
       description.addAll('(', ' or ', ')', _matchers);
 }
 
-List<Matcher> _wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6) {
+List<Matcher> _wrapArgs(Object? arg0, Object? arg1, Object? arg2, Object? arg3,
+    Object? arg4, Object? arg5, Object? arg6) {
   Iterable args;
   if (arg0 is List) {
     if (arg1 != null ||
diff --git a/lib/src/order_matchers.dart b/lib/src/order_matchers.dart
index c492595..8741b93 100644
--- a/lib/src/order_matchers.dart
+++ b/lib/src/order_matchers.dart
@@ -6,22 +6,22 @@
 
 /// Returns a matcher which matches if the match argument is greater
 /// than the given [value].
-Matcher greaterThan(value) =>
+Matcher greaterThan(Object value) =>
     _OrderingMatcher(value, false, false, true, 'a value greater than');
 
 /// Returns a matcher which matches if the match argument is greater
 /// than or equal to the given [value].
-Matcher greaterThanOrEqualTo(value) => _OrderingMatcher(
+Matcher greaterThanOrEqualTo(Object value) => _OrderingMatcher(
     value, true, false, true, 'a value greater than or equal to');
 
 /// Returns a matcher which matches if the match argument is less
 /// than the given [value].
-Matcher lessThan(value) =>
+Matcher lessThan(Object value) =>
     _OrderingMatcher(value, false, true, false, 'a value less than');
 
 /// Returns a matcher which matches if the match argument is less
 /// than or equal to the given [value].
-Matcher lessThanOrEqualTo(value) =>
+Matcher lessThanOrEqualTo(Object value) =>
     _OrderingMatcher(value, true, true, false, 'a value less than or equal to');
 
 /// A matcher which matches if the match argument is zero.
@@ -75,10 +75,10 @@
       : _valueInDescription = valueInDescription;
 
   @override
-  bool matches(item, Map matchState) {
+  bool matches(Object? item, Map matchState) {
     if (item == _value) {
       return _equalValue;
-    } else if (item < _value) {
+    } else if ((item as dynamic) < _value) {
       return _lessThanValue;
     } else if (item > _value) {
       return _greaterThanValue;
diff --git a/lib/src/pretty_print.dart b/lib/src/pretty_print.dart
index 4ac50ee..152116c 100644
--- a/lib/src/pretty_print.dart
+++ b/lib/src/pretty_print.dart
@@ -15,8 +15,8 @@
 ///
 /// If [maxItems] is passed, [Iterable]s and [Map]s will only print their first
 /// [maxItems] members or key/value pairs, respectively.
-String prettyPrint(object, {int? maxLineLength, int? maxItems}) {
-  String _prettyPrint(object, int indent, Set<Object?> seen, bool top) {
+String prettyPrint(Object? object, {int? maxLineLength, int? maxItems}) {
+  String _prettyPrint(Object? object, int indent, Set<Object?> seen, bool top) {
     // If the object is a matcher, use its description.
     if (object is Matcher) {
       var description = StringDescription();
@@ -27,7 +27,7 @@
     // Avoid looping infinitely on recursively-nested data structures.
     if (seen.contains(object)) return '(recursive)';
     seen = seen.union({object});
-    String pp(child) => _prettyPrint(child, indent + 2, seen, false);
+    String pp(Object? child) => _prettyPrint(child, indent + 2, seen, false);
 
     if (object is Iterable) {
       // Print the type name for non-List iterables.
@@ -123,7 +123,7 @@
 
 /// Returns the name of the type of [x] with fallbacks for core types with
 /// private implementations.
-String _typeName(x) {
+String _typeName(Object x) {
   if (x is Type) return 'Type';
   if (x is Uri) return 'Uri';
   if (x is Set) return 'Set';
diff --git a/lib/src/string_matchers.dart b/lib/src/string_matchers.dart
index 868d2dc..9484a9c 100644
--- a/lib/src/string_matchers.dart
+++ b/lib/src/string_matchers.dart
@@ -138,12 +138,12 @@
 ///
 /// [re] can be a [RegExp] instance or a [String]; in the latter case it will be
 /// used to create a RegExp instance.
-Matcher matches(re) => _MatchesRegExp(re);
+Matcher matches(Pattern re) => _MatchesRegExp(re);
 
 class _MatchesRegExp extends FeatureMatcher<String> {
   final RegExp _regexp;
 
-  _MatchesRegExp(re)
+  _MatchesRegExp(Pattern re)
       : _regexp = (re is String)
             ? RegExp(re)
             : (re is RegExp)
diff --git a/lib/src/util.dart b/lib/src/util.dart
index c9d3d00..95451b0 100644
--- a/lib/src/util.dart
+++ b/lib/src/util.dart
@@ -34,19 +34,19 @@
 /// If the argument is already a matcher this does nothing,
 /// else if the argument is a function, it generates a predicate
 /// function matcher, else it generates an equals matcher.
-Matcher wrapMatcher(x) {
-  if (x is Matcher) {
-    return x;
-  } else if (x is bool Function(Object?)) {
-    // x is already a predicate that can handle anything
-    return predicate(x);
-  } else if (x is bool Function(Never)) {
-    // x is a unary predicate, but expects a specific type
+Matcher wrapMatcher(Object? valueOrMatcher) {
+  if (valueOrMatcher is Matcher) {
+    return valueOrMatcher;
+  } else if (valueOrMatcher is bool Function(Object?)) {
+    // already a predicate that can handle anything
+    return predicate(valueOrMatcher);
+  } else if (valueOrMatcher is bool Function(Never)) {
+    // unary predicate, but expects a specific type
     // so wrap it.
     // ignore: unnecessary_lambdas
-    return predicate((a) => (x as dynamic)(a));
+    return predicate((a) => (valueOrMatcher as dynamic)(a));
   } else {
-    return equals(x);
+    return equals(valueOrMatcher);
   }
 }
 
diff --git a/pubspec.yaml b/pubspec.yaml
index 5667861..7de79ef 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: matcher
-version: 0.12.10
+version: 0.12.11-dev
 
 description: >-
   Support for specifying test expectations via an extensible Matcher class.
@@ -17,3 +17,6 @@
   test: any
   test_api: any
   test_core: any
+
+dependency_overrides:
+  test_api: any
diff --git a/test/custom_matcher_test.dart b/test/custom_matcher_test.dart
index 65f1520..d310d22 100644
--- a/test/custom_matcher_test.dart
+++ b/test/custom_matcher_test.dart
@@ -14,9 +14,10 @@
 }
 
 class _HasPrice extends CustomMatcher {
-  _HasPrice(matcher) : super('Widget with a price that is', 'price', matcher);
+  _HasPrice(Object? matcher)
+      : super('Widget with a price that is', 'price', matcher);
   @override
-  Object? featureValueOf(actual) => (actual as Widget).price;
+  Object? featureValueOf(Object? actual) => (actual as Widget).price;
 }
 
 void main() {
diff --git a/test/having_test.dart b/test/having_test.dart
index 577d224..a9516d4 100644
--- a/test/having_test.dart
+++ b/test/having_test.dart
@@ -108,7 +108,7 @@
     .having((e) => e.start, 'start', isNull)
     .having((e) => e.end, 'end', isNull);
 
-Matcher _hasPrice(matcher) =>
+Matcher _hasPrice(Object matcher) =>
     const TypeMatcher<Widget>().having((e) => e.price, 'price', matcher);
 
 Matcher _badCustomMatcher() => const TypeMatcher<Widget>()
diff --git a/test/test_utils.dart b/test/test_utils.dart
index 9f58d0d..89a61ac 100644
--- a/test/test_utils.dart
+++ b/test/test_utils.dart
@@ -4,7 +4,7 @@
 
 import 'package:test/test.dart';
 
-void shouldFail(value, Matcher matcher, expected) {
+void shouldFail(Object? value, Matcher matcher, Object? expected) {
   var failed = false;
   try {
     expect(value, matcher);
@@ -23,7 +23,7 @@
   expect(failed, isTrue, reason: 'Expected to fail.');
 }
 
-void shouldPass(value, Matcher matcher) {
+void shouldPass(Object? value, Matcher matcher) {
   expect(value, matcher);
 }