diff --git a/example/main.dart b/example/main.dart
index bf78a51..00f9515 100644
--- a/example/main.dart
+++ b/example/main.dart
@@ -7,6 +7,6 @@
   // server.
   var server = await HttpMultiServer.loopback(8080);
   shelf_io.serveRequests(server, (request) {
-    return shelf.Response.ok("Hello, world!");
+    return shelf.Response.ok('Hello, world!');
   });
 }
diff --git a/lib/http_multi_server.dart b/lib/http_multi_server.dart
index 1f10215..1ba0a2b 100644
--- a/lib/http_multi_server.dart
+++ b/lib/http_multi_server.dart
@@ -106,7 +106,7 @@
   /// See [HttpServer.bind].
   static Future<HttpServer> loopback(int port,
       {int backlog, bool v6Only = false, bool shared = false}) {
-    if (backlog == null) backlog = 0;
+    backlog ??= 0;
 
     return _loopback(
         port,
@@ -122,7 +122,7 @@
       bool v6Only = false,
       bool requestClientCertificate = false,
       bool shared = false}) {
-    if (backlog == null) backlog = 0;
+    backlog ??= 0;
 
     return _loopback(
         port,
@@ -161,7 +161,7 @@
   /// [bind] should forward to either [HttpServer.bind] or
   /// [HttpServer.bindSecure].
   static Future<HttpServer> _loopback(
-      int port, Future<HttpServer> bind(InternetAddress address, int port),
+      int port, Future<HttpServer> Function(InternetAddress, int port) bind,
       [int remainingRetries]) async {
     remainingRetries ??= 5;
 
diff --git a/lib/src/multi_headers.dart b/lib/src/multi_headers.dart
index d1dd93f..f88aa31 100644
--- a/lib/src/multi_headers.dart
+++ b/lib/src/multi_headers.dart
@@ -101,7 +101,7 @@
   }
 
   @override
-  void forEach(void f(String name, List<String> values)) =>
+  void forEach(void Function(String name, List<String> values) f) =>
       _headers.first.forEach(f);
 
   @override
diff --git a/pubspec.yaml b/pubspec.yaml
index dc78335..6ccb01c 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: http_multi_server
-version: 2.1.0
+version: 2.1.1-dev
 
 description: >-
   A dart:io HttpServer wrapper that handles requests from multiple servers.
diff --git a/test/http_multi_server_test.dart b/test/http_multi_server_test.dart
index 65cfd57..00405f8 100644
--- a/test/http_multi_server_test.dart
+++ b/test/http_multi_server_test.dart
@@ -11,127 +11,127 @@
 import 'package:test/test.dart';
 
 void main() {
-  group("with multiple HttpServers", () {
+  group('with multiple HttpServers', () {
     var multiServer;
     HttpServer subServer1;
     HttpServer subServer2;
     HttpServer subServer3;
     setUp(() {
       return Future.wait([
-        HttpServer.bind("localhost", 0).then((server) => subServer1 = server),
-        HttpServer.bind("localhost", 0).then((server) => subServer2 = server),
-        HttpServer.bind("localhost", 0).then((server) => subServer3 = server)
+        HttpServer.bind('localhost', 0).then((server) => subServer1 = server),
+        HttpServer.bind('localhost', 0).then((server) => subServer2 = server),
+        HttpServer.bind('localhost', 0).then((server) => subServer3 = server)
       ]).then((servers) => multiServer = HttpMultiServer(servers));
     });
 
     tearDown(() => multiServer.close());
 
-    test("listen listens to all servers", () {
+    test('listen listens to all servers', () {
       multiServer.listen((request) {
-        request.response.write("got request");
+        request.response.write('got request');
         request.response.close();
       });
 
-      expect(_read(subServer1), completion(equals("got request")));
-      expect(_read(subServer2), completion(equals("got request")));
-      expect(_read(subServer3), completion(equals("got request")));
+      expect(_read(subServer1), completion(equals('got request')));
+      expect(_read(subServer2), completion(equals('got request')));
+      expect(_read(subServer3), completion(equals('got request')));
     });
 
-    test("serverHeader= sets the value for all servers", () {
-      multiServer.serverHeader = "http_multi_server test";
+    test('serverHeader= sets the value for all servers', () {
+      multiServer.serverHeader = 'http_multi_server test';
 
       multiServer.listen((request) {
-        request.response.write("got request");
+        request.response.write('got request');
         request.response.close();
       });
 
       expect(
           _get(subServer1).then((response) {
             expect(
-                response.headers['server'], equals("http_multi_server test"));
+                response.headers['server'], equals('http_multi_server test'));
           }),
           completes);
 
       expect(
           _get(subServer2).then((response) {
             expect(
-                response.headers['server'], equals("http_multi_server test"));
+                response.headers['server'], equals('http_multi_server test'));
           }),
           completes);
 
       expect(
           _get(subServer3).then((response) {
             expect(
-                response.headers['server'], equals("http_multi_server test"));
+                response.headers['server'], equals('http_multi_server test'));
           }),
           completes);
     });
 
-    test("autoCompress= sets the value for all servers", () {
+    test('autoCompress= sets the value for all servers', () {
       multiServer.autoCompress = true;
 
       multiServer.listen((request) {
-        request.response.write("got request");
+        request.response.write('got request');
         request.response.close();
       });
 
       expect(
           _get(subServer1).then((response) {
-            expect(response.headers['content-encoding'], equals("gzip"));
+            expect(response.headers['content-encoding'], equals('gzip'));
           }),
           completes);
 
       expect(
           _get(subServer2).then((response) {
-            expect(response.headers['content-encoding'], equals("gzip"));
+            expect(response.headers['content-encoding'], equals('gzip'));
           }),
           completes);
 
       expect(
           _get(subServer3).then((response) {
-            expect(response.headers['content-encoding'], equals("gzip"));
+            expect(response.headers['content-encoding'], equals('gzip'));
           }),
           completes);
     });
 
-    test("headers.set sets the value for all servers", () {
+    test('headers.set sets the value for all servers', () {
       multiServer.defaultResponseHeaders
-          .set("server", "http_multi_server test");
+          .set('server', 'http_multi_server test');
 
       multiServer.listen((request) {
-        request.response.write("got request");
+        request.response.write('got request');
         request.response.close();
       });
 
       expect(
           _get(subServer1).then((response) {
             expect(
-                response.headers['server'], equals("http_multi_server test"));
+                response.headers['server'], equals('http_multi_server test'));
           }),
           completes);
 
       expect(
           _get(subServer2).then((response) {
             expect(
-                response.headers['server'], equals("http_multi_server test"));
+                response.headers['server'], equals('http_multi_server test'));
           }),
           completes);
 
       expect(
           _get(subServer3).then((response) {
             expect(
-                response.headers['server'], equals("http_multi_server test"));
+                response.headers['server'], equals('http_multi_server test'));
           }),
           completes);
     });
 
-    test("connectionsInfo sums the values for all servers", () {
+    test('connectionsInfo sums the values for all servers', () {
       var pendingRequests = 0;
       var awaitingResponseCompleter = Completer();
       var sendResponseCompleter = Completer();
       multiServer.listen((request) {
         sendResponseCompleter.future.then((_) {
-          request.response.write("got request");
+          request.response.write('got request');
           request.response.close();
         });
 
@@ -156,7 +156,7 @@
     });
   });
 
-  group("HttpMultiServer.loopback", () {
+  group('HttpMultiServer.loopback', () {
     var server;
     setUp(() {
       return HttpMultiServer.loopback(0).then((s) => server = s);
@@ -164,75 +164,75 @@
 
     tearDown(() => server.close());
 
-    test("listens on all localhost interfaces", () async {
+    test('listens on all localhost interfaces', () async {
       server.listen((request) {
-        request.response.write("got request");
+        request.response.write('got request');
         request.response.close();
       });
 
       if (await supportsIPv4) {
-        expect(http.read("http://127.0.0.1:${server.port}/"),
-            completion(equals("got request")));
+        expect(http.read('http://127.0.0.1:${server.port}/'),
+            completion(equals('got request')));
       }
 
       if (await supportsIPv6) {
-        expect(http.read("http://[::1]:${server.port}/"),
-            completion(equals("got request")));
+        expect(http.read('http://[::1]:${server.port}/'),
+            completion(equals('got request')));
       }
     });
   });
 
-  group("HttpMultiServer.bind", () {
+  group('HttpMultiServer.bind', () {
     test("listens on all localhost interfaces for 'localhost'", () async {
-      final server = await HttpMultiServer.bind("localhost", 0);
+      final server = await HttpMultiServer.bind('localhost', 0);
       server.listen((request) {
-        request.response.write("got request");
+        request.response.write('got request');
         request.response.close();
       });
 
       if (await supportsIPv4) {
-        expect(http.read("http://127.0.0.1:${server.port}/"),
-            completion(equals("got request")));
+        expect(http.read('http://127.0.0.1:${server.port}/'),
+            completion(equals('got request')));
       }
 
       if (await supportsIPv6) {
-        expect(http.read("http://[::1]:${server.port}/"),
-            completion(equals("got request")));
+        expect(http.read('http://[::1]:${server.port}/'),
+            completion(equals('got request')));
       }
     });
 
     test("listens on all localhost interfaces for 'any'", () async {
-      final server = await HttpMultiServer.bind("any", 0);
+      final server = await HttpMultiServer.bind('any', 0);
       server.listen((request) {
-        request.response.write("got request");
+        request.response.write('got request');
         request.response.close();
       });
 
       if (await supportsIPv4) {
-        expect(http.read("http://127.0.0.1:${server.port}/"),
-            completion(equals("got request")));
+        expect(http.read('http://127.0.0.1:${server.port}/'),
+            completion(equals('got request')));
       }
 
       if (await supportsIPv6) {
-        expect(http.read("http://[::1]:${server.port}/"),
-            completion(equals("got request")));
+        expect(http.read('http://[::1]:${server.port}/'),
+            completion(equals('got request')));
       }
     });
 
-    test("listens on specified hostname", () async {
+    test('listens on specified hostname', () async {
       final server = await HttpMultiServer.bind(InternetAddress.anyIPv4, 0);
       server.listen((request) {
-        request.response.write("got request");
+        request.response.write('got request');
         request.response.close();
       });
 
       if (await supportsIPv4) {
-        expect(http.read("http://127.0.0.1:${server.port}/"),
-            completion(equals("got request")));
+        expect(http.read('http://127.0.0.1:${server.port}/'),
+            completion(equals('got request')));
       }
 
       if (await supportsIPv6) {
-        expect(http.read("http://[::1]:${server.port}/"),
+        expect(http.read('http://[::1]:${server.port}/'),
             throwsA(isA<SocketException>()));
       }
     });
@@ -247,4 +247,4 @@
 
 /// Returns the URL for the root of [server].
 String _urlFor(HttpServer server) =>
-    "http://${server.address.host}:${server.port}/";
+    'http://${server.address.host}:${server.port}/';
