diff --git a/lib/dart/Makefile.am b/lib/dart/Makefile.am
index 74f1404..3518a87 100644
--- a/lib/dart/Makefile.am
+++ b/lib/dart/Makefile.am
@@ -17,6 +17,9 @@
 # under the License.
 #
 
+# Dart build command
+DARTPUB = dart pub
+
 all-local:
 	$(DARTPUB) get
 
diff --git a/lib/dart/lib/src/browser/t_web_socket.dart b/lib/dart/lib/src/browser/t_web_socket.dart
index 1d0bfeb..1667831 100644
--- a/lib/dart/lib/src/browser/t_web_socket.dart
+++ b/lib/dart/lib/src/browser/t_web_socket.dart
@@ -49,19 +49,19 @@
       : _onStateController = StreamController.broadcast(),
         _onErrorController = StreamController.broadcast(),
         _onMessageController = StreamController.broadcast() {
-    if (url == null || !url.hasAuthority || !url.hasPort) {
+    if (!url.hasAuthority || !url.hasPort) {
       throw ArgumentError('Invalid url');
     }
   }
 
-  WebSocket _socket;
+  WebSocket? _socket;
 
   @override
-  bool get isOpen => _socket != null && _socket.readyState == WebSocket.OPEN;
+  bool get isOpen => _socket != null && _socket!.readyState == WebSocket.OPEN;
 
   @override
   bool get isClosed =>
-      _socket == null || _socket.readyState == WebSocket.CLOSED;
+      _socket == null ||_socket!.readyState == WebSocket.CLOSED;
 
   @override
   Future open() {
@@ -71,19 +71,19 @@
     }
 
     _socket = WebSocket(url.toString());
-    _socket.onError.listen(_onError);
-    _socket.onOpen.listen(_onOpen);
-    _socket.onClose.listen(_onClose);
-    _socket.onMessage.listen(_onMessage);
+    _socket!.onError.listen(_onError);
+    _socket!.onOpen.listen(_onOpen);
+    _socket!.onClose.listen(_onClose);
+    _socket!.onMessage.listen(_onMessage);
 
-    return _socket.onOpen.first;
+    return _socket!.onOpen.first;
   }
 
   @override
   Future close() {
     if (_socket != null) {
-      _socket.close();
-      return _socket.onClose.first;
+      _socket!.close();
+      return _socket!.onClose.first;
     } else {
       return Future.value();
     }
@@ -98,7 +98,7 @@
   void _sendRequests() {
     while (isOpen && _requests.isNotEmpty) {
       Uint8List data = _requests.removeAt(0);
-      _socket.sendString(base64.encode(data));
+      _socket!.sendString(base64.encode(data));
     }
   }
 
diff --git a/lib/dart/lib/src/console/t_tcp_socket.dart b/lib/dart/lib/src/console/t_tcp_socket.dart
index 610d633..7c17f42 100644
--- a/lib/dart/lib/src/console/t_tcp_socket.dart
+++ b/lib/dart/lib/src/console/t_tcp_socket.dart
@@ -37,7 +37,7 @@
   @override
   Stream<Uint8List> get onMessage => _onMessageController.stream;
 
-  TTcpSocket(Socket socket)
+  TTcpSocket(Socket? socket)
       : _onStateController = StreamController.broadcast(),
         _onErrorController = StreamController.broadcast(),
         _onMessageController = StreamController.broadcast() {
@@ -46,10 +46,10 @@
     }
 
     _socket = socket;
-    _socket.listen(_onMessage, onError: _onError, onDone: close);
+    _socket!.listen(_onMessage, onError: _onError, onDone: close);
   }
 
-  Socket _socket;
+  Socket? _socket;
 
   @override
   bool get isOpen => _socket != null;
@@ -65,7 +65,7 @@
   @override
   Future close() async {
     if (_socket != null) {
-      await _socket.close();
+      await _socket!.close();
       _socket = null;
     }
 
@@ -74,7 +74,9 @@
 
   @override
   void send(Uint8List data) {
-    _socket.add(data);
+     if (_socket != null) {
+      _socket!.add(data);
+     }
   }
 
   void _onMessage(List<int> message) {
diff --git a/lib/dart/lib/src/console/t_web_socket.dart b/lib/dart/lib/src/console/t_web_socket.dart
index d69cafe..98fdf70 100644
--- a/lib/dart/lib/src/console/t_web_socket.dart
+++ b/lib/dart/lib/src/console/t_web_socket.dart
@@ -38,7 +38,7 @@
   @override
   Stream<Uint8List> get onMessage => _onMessageController.stream;
 
-  TWebSocket(WebSocket socket)
+  TWebSocket(WebSocket? socket)
       : _onStateController = StreamController.broadcast(),
         _onErrorController = StreamController.broadcast(),
         _onMessageController = StreamController.broadcast() {
@@ -47,10 +47,12 @@
     }
 
     _socket = socket;
-    _socket.listen(_onMessage, onError: _onError, onDone: close);
+    _socket!.listen((dynamic message) => _onMessage(message as String),
+      onError: (dynamic error) => _onError(error),
+      onDone: () => close(),);
   }
 
-  WebSocket _socket;
+  WebSocket? _socket;
 
   @override
   bool get isOpen => _socket != null;
@@ -66,7 +68,7 @@
   @override
   Future close() async {
     if (_socket != null) {
-      await _socket.close();
+      await _socket!.close();
       _socket = null;
     }
 
@@ -75,7 +77,9 @@
 
   @override
   void send(Uint8List data) {
-    _socket.add(base64.encode(data));
+    if (_socket != null) {
+      _socket!.add(base64.encode(data));
+    }
   }
 
   void _onMessage(String message) {
diff --git a/lib/dart/lib/src/protocol/t_binary_protocol.dart b/lib/dart/lib/src/protocol/t_binary_protocol.dart
index 9f8f3bf..5ddab2c 100644
--- a/lib/dart/lib/src/protocol/t_binary_protocol.dart
+++ b/lib/dart/lib/src/protocol/t_binary_protocol.dart
@@ -114,7 +114,6 @@
 
   @override
   void writeBool(bool b) {
-    if (b == null) b = false;
     writeByte(b ? 1 : 0);
   }
 
@@ -122,7 +121,6 @@
 
   @override
   void writeByte(int byte) {
-    if (byte == null) byte = 0;
     _byteOut.setUint8(0, byte);
     transport.write(_byteOut.buffer.asUint8List(), 0, 1);
   }
@@ -131,7 +129,6 @@
 
   @override
   void writeI16(int i16) {
-    if (i16 == null) i16 = 0;
     _i16Out.setInt16(0, i16);
     transport.write(_i16Out.buffer.asUint8List(), 0, 2);
   }
@@ -140,7 +137,6 @@
 
   @override
   void writeI32(int i32) {
-    if (i32 == null) i32 = 0;
     _i32Out.setInt32(0, i32);
     transport.write(_i32Out.buffer.asUint8List(), 0, 4);
   }
@@ -149,7 +145,6 @@
 
   @override
   void writeI64(int i64) {
-    if (i64 == null) i64 = 0;
     var i = Int64(i64);
     var bts = i.toBytes();
     for (var j = 0; j < 8; j++) {
@@ -160,7 +155,7 @@
 
   @override
   void writeString(String s) {
-    var bytes = s != null ? _utf8Codec.encode(s) : Uint8List.fromList([]);
+    var bytes = _utf8Codec.encode(s);
     writeI32(bytes.length);
     transport.write(bytes, 0, bytes.length);
   }
@@ -169,7 +164,6 @@
 
   @override
   void writeDouble(double d) {
-    if (d == null) d = 0.0;
     _doubleOut.setFloat64(0, d);
     transport.write(_doubleOut.buffer.asUint8List(), 0, 8);
   }
diff --git a/lib/dart/lib/src/protocol/t_compact_protocol.dart b/lib/dart/lib/src/protocol/t_compact_protocol.dart
index dc26722..341b659 100644
--- a/lib/dart/lib/src/protocol/t_compact_protocol.dart
+++ b/lib/dart/lib/src/protocol/t_compact_protocol.dart
@@ -54,7 +54,8 @@
   static const int TYPE_MAP = 0x0B;
   static const int TYPE_STRUCT = 0x0C;
 
-  static final List<int> _typeMap = List.unmodifiable(List(16)
+static final List<int> _typeMap = List<int>.unmodifiable(
+  List<int>.filled(16, 0)
     ..[TType.STOP] = TType.STOP
     ..[TType.BOOL] = TYPE_BOOLEAN_TRUE
     ..[TType.BYTE] = TYPE_BYTE
@@ -66,7 +67,8 @@
     ..[TType.LIST] = TYPE_LIST
     ..[TType.SET] = TYPE_SET
     ..[TType.MAP] = TYPE_MAP
-    ..[TType.STRUCT] = TYPE_STRUCT);
+    ..[TType.STRUCT] = TYPE_STRUCT,
+);
 
   static const Utf8Codec _utf8Codec = Utf8Codec();
 
@@ -74,8 +76,8 @@
   DoubleLinkedQueue<int> _lastField = DoubleLinkedQueue<int>();
   int _lastFieldId = 0;
 
-  TField _booleanField;
-  bool _boolValue;
+  TField? _booleanField;
+  bool? _boolValue;
 
   final Uint8List tempList = Uint8List(10);
   final ByteData tempBD = ByteData(10);
@@ -169,10 +171,9 @@
 
   @override
   void writeBool(bool b) {
-    if (b == null) b = false;
     if (_booleanField != null) {
       _writeFieldBegin(
-          _booleanField, b ? TYPE_BOOLEAN_TRUE : TYPE_BOOLEAN_FALSE);
+          _booleanField!, b ? TYPE_BOOLEAN_TRUE : TYPE_BOOLEAN_FALSE);
       _booleanField = null;
     } else {
       writeByte(b ? TYPE_BOOLEAN_TRUE : TYPE_BOOLEAN_FALSE);
@@ -181,40 +182,34 @@
 
   @override
   void writeByte(int b) {
-    if (b == null) b = 0;
     tempList[0] = b;
     transport.write(tempList, 0, 1);
   }
 
   @override
   void writeI16(int i16) {
-    if (i16 == null) i16 = 0;
     _writeVarInt32(_int32ToZigZag(Int32(i16)));
   }
 
   @override
   void writeI32(int i32) {
-    if (i32 == null) i32 = 0;
     _writeVarInt32(_int32ToZigZag(Int32(i32)));
   }
 
   @override
   void writeI64(int i64) {
-    if (i64 == null) i64 = 0;
     _writeVarInt64(_int64ToZigZag(Int64(i64)));
   }
 
   @override
   void writeDouble(double d) {
-    if (d == null) d = 0.0;
     tempBD.setFloat64(0, d, Endian.little);
     transport.write(tempBD.buffer.asUint8List(), 0, 8);
   }
 
   @override
   void writeString(String str) {
-    Uint8List bytes =
-        str != null ? _utf8Codec.encode(str) : Uint8List.fromList([]);
+    Uint8List bytes = _utf8Codec.encode(str);
     writeBinary(bytes);
   }
 
@@ -374,7 +369,7 @@
   @override
   bool readBool() {
     if (_boolValue != null) {
-      bool result = _boolValue;
+      bool result = _boolValue!;
       _boolValue = null;
       return result;
     }
diff --git a/lib/dart/lib/src/protocol/t_json_protocol.dart b/lib/dart/lib/src/protocol/t_json_protocol.dart
index 4aaf20c..9752a41 100644
--- a/lib/dart/lib/src/protocol/t_json_protocol.dart
+++ b/lib/dart/lib/src/protocol/t_json_protocol.dart
@@ -32,15 +32,16 @@
 
   static const Utf8Codec utf8Codec = Utf8Codec();
 
-  _BaseContext _context;
-  _BaseContext _rootContext;
-  _LookaheadReader _reader;
+  late _BaseContext _context;
+  late _BaseContext _rootContext;
+  late _LookaheadReader _reader;
 
   final List<_BaseContext> _contextStack = [];
   final Uint8List _tempBuffer = Uint8List(4);
 
   TJsonProtocol(TTransport transport) : super(transport) {
     _rootContext = _BaseContext(this);
+    _context = _rootContext;
     _reader = _LookaheadReader(this);
     _resetContext();
   }
@@ -122,8 +123,6 @@
   }
 
   void _writeJsonInteger(int i) {
-    if (i == null) i = 0;
-
     _context.write();
     String str = i.toString();
 
@@ -137,8 +136,6 @@
   }
 
   void _writeJsonDouble(double d) {
-    if (d == null) d = 0.0;
-
     _context.write();
     String str = d.toString();
     bool escapeNumbers = d.isNaN || d.isInfinite || _context.escapeNumbers;
@@ -267,7 +264,6 @@
 
   @override
   void writeBool(bool b) {
-    if (b == null) b = false;
     _writeJsonInteger(b ? 1 : 0);
   }
 
@@ -298,7 +294,7 @@
 
   @override
   void writeString(String s) {
-    var bytes = s != null ? utf8Codec.encode(s) : Uint8List.fromList([]);
+    var bytes = utf8Codec.encode(s);
     _writeJsonString(bytes);
   }
 
@@ -418,7 +414,7 @@
       Uint8List bytes = _readJsonString(skipContext: true);
       double d;
       try {
-        d = double.tryParse(utf8Codec.decode(bytes));
+        d = double.parse(utf8Codec.decode(bytes));
       } catch (_) {
         throw TProtocolError(TProtocolErrorType.INVALID_DATA,
             "Bad data encounted in numeric data");
@@ -675,7 +671,7 @@
           TProtocolErrorType.NOT_IMPLEMENTED, "Unrecognized type");
     }
 
-    return _TYPE_ID_TO_NAME_BYTES[typeId];
+    return _TYPE_ID_TO_NAME_BYTES[typeId]!;
   }
 
   static final Map<String, int> _NAME_TO_TYPE_ID = Map.unmodifiable({
@@ -699,7 +695,7 @@
           TProtocolErrorType.NOT_IMPLEMENTED, "Unrecognized type");
     }
 
-    return _NAME_TO_TYPE_ID[name];
+    return _NAME_TO_TYPE_ID[name]!;
   }
 
   static final Set<int> _JSON_NUMERICS = Set.from([
diff --git a/lib/dart/lib/src/protocol/t_multiplexed_protocol.dart b/lib/dart/lib/src/protocol/t_multiplexed_protocol.dart
index 693e58b..42030a8 100644
--- a/lib/dart/lib/src/protocol/t_multiplexed_protocol.dart
+++ b/lib/dart/lib/src/protocol/t_multiplexed_protocol.dart
@@ -25,11 +25,7 @@
 
   TMultiplexedProtocol(TProtocol protocol, String serviceName)
       : _serviceName = serviceName,
-        super(protocol) {
-    if (serviceName == null) {
-      throw ArgumentError.notNull("serviceName");
-    }
-  }
+        super(protocol);
 
   @override
   void writeMessageBegin(TMessage message) {
diff --git a/lib/dart/lib/src/serializer/t_deserializer.dart b/lib/dart/lib/src/serializer/t_deserializer.dart
index c01ab6b..f284ee6 100644
--- a/lib/dart/lib/src/serializer/t_deserializer.dart
+++ b/lib/dart/lib/src/serializer/t_deserializer.dart
@@ -19,10 +19,10 @@
 
 class TDeserializer {
   final message = TMessage('Deserializer', TMessageType.ONEWAY, 1);
-  TBufferedTransport transport;
-  TProtocol protocol;
+  late TBufferedTransport transport;
+  late TProtocol protocol;
 
-  TDeserializer({TProtocolFactory protocolFactory}) {
+  TDeserializer({TProtocolFactory? protocolFactory}) {
     this.transport = TBufferedTransport();
 
     if (protocolFactory == null) {
diff --git a/lib/dart/lib/src/serializer/t_serializer.dart b/lib/dart/lib/src/serializer/t_serializer.dart
index fb89789..17cab53 100644
--- a/lib/dart/lib/src/serializer/t_serializer.dart
+++ b/lib/dart/lib/src/serializer/t_serializer.dart
@@ -19,10 +19,10 @@
 
 class TSerializer {
   final message = TMessage('Serializer', TMessageType.ONEWAY, 1);
-  TBufferedTransport transport;
-  TProtocol protocol;
+  late TBufferedTransport transport;
+  late TProtocol protocol;
 
-  TSerializer({TProtocolFactory protocolFactory}) {
+  TSerializer({TProtocolFactory? protocolFactory}) {
     this.transport = TBufferedTransport();
 
     if (protocolFactory == null) {
diff --git a/lib/dart/lib/src/t_application_error.dart b/lib/dart/lib/src/t_application_error.dart
index 38449a9..69c0138 100644
--- a/lib/dart/lib/src/t_application_error.dart
+++ b/lib/dart/lib/src/t_application_error.dart
@@ -45,7 +45,7 @@
   static TApplicationError read(TProtocol iprot) {
     TField field;
 
-    String message;
+    String message = "";
     int type = TApplicationErrorType.UNKNOWN;
 
     iprot.readStructBegin();
@@ -87,7 +87,7 @@
   write(TProtocol oprot) {
     oprot.writeStructBegin(_struct);
 
-    if (message != null && message.isNotEmpty) {
+    if (message.isNotEmpty) {
       oprot.writeFieldBegin(_messageField);
       oprot.writeString(message);
       oprot.writeFieldEnd();
diff --git a/lib/dart/lib/src/transport/t_buffered_transport.dart b/lib/dart/lib/src/transport/t_buffered_transport.dart
index f17b2ee..f6c5ea6 100644
--- a/lib/dart/lib/src/transport/t_buffered_transport.dart
+++ b/lib/dart/lib/src/transport/t_buffered_transport.dart
@@ -20,7 +20,7 @@
 /// Buffered implementation of [TTransport].
 class TBufferedTransport extends TTransport {
   final List<int> _writeBuffer = [];
-  Iterator<int> _readIterator;
+  Iterator<int>? _readIterator;
 
   Uint8List consumeWriteBuffer() {
     Uint8List buffer = Uint8List.fromList(_writeBuffer);
@@ -29,7 +29,7 @@
   }
 
   void _setReadBuffer(Uint8List readBuffer) {
-    _readIterator = readBuffer != null ? readBuffer.iterator : null;
+    _readIterator = readBuffer.iterator;
   }
 
   void _reset({bool isOpen = false}) {
@@ -40,7 +40,7 @@
 
   bool get hasReadData => _readIterator != null;
 
-  bool _isOpen;
+  bool _isOpen = false;
   @override
   bool get isOpen => _isOpen;
 
@@ -56,10 +56,6 @@
 
   @override
   int read(Uint8List buffer, int offset, int length) {
-    if (buffer == null) {
-      throw ArgumentError.notNull("buffer");
-    }
-
     if (offset + length > buffer.length) {
       throw ArgumentError("The range exceeds the buffer length");
     }
@@ -69,13 +65,17 @@
     }
 
     int i = 0;
-    while (i < length && _readIterator.moveNext()) {
-      buffer[offset + i] = _readIterator.current;
+    bool hasData = true;
+    while (i < length && hasData) {
+      hasData = _readIterator!.moveNext();
+      if (hasData) {
+      buffer[offset + i] = _readIterator!.current;
       i++;
+      }
     }
 
     // cleanup iterator when we've reached the end
-    if (_readIterator.current == null) {
+    if (!hasData) {
       _readIterator = null;
     }
 
@@ -84,10 +84,6 @@
 
   @override
   void write(Uint8List buffer, int offset, int length) {
-    if (buffer == null) {
-      throw ArgumentError.notNull("buffer");
-    }
-
     if (offset + length > buffer.length) {
       throw ArgumentError("The range exceeds the buffer length");
     }
diff --git a/lib/dart/lib/src/transport/t_framed_transport.dart b/lib/dart/lib/src/transport/t_framed_transport.dart
index 3fc55fa..de09e51 100644
--- a/lib/dart/lib/src/transport/t_framed_transport.dart
+++ b/lib/dart/lib/src/transport/t_framed_transport.dart
@@ -29,16 +29,12 @@
   int _receivedHeaderBytes = 0;
 
   int _bodySize = 0;
-  Uint8List _body;
+  Uint8List? _body;
   int _receivedBodyBytes = 0;
 
-  Completer<Uint8List> _frameCompleter;
+  Completer<Uint8List>? _frameCompleter;
 
-  TFramedTransport(TTransport transport) : _transport = transport {
-    if (transport == null) {
-      throw ArgumentError.notNull("transport");
-    }
-  }
+  TFramedTransport(TTransport transport) : _transport = transport;
 
   @override
   bool get isOpen => _transport.isOpen;
@@ -115,7 +111,7 @@
   void _readFrameBody() {
     var remainingBodyBytes = _bodySize - _receivedBodyBytes;
 
-    int got = _transport.read(_body, _receivedBodyBytes, remainingBodyBytes);
+    int got = _transport.read(_body!, _receivedBodyBytes, remainingBodyBytes);
     if (got < 0) {
       throw TTransportError(
           TTransportErrorType.UNKNOWN, "Socket closed during frame body read");
@@ -124,7 +120,7 @@
     _receivedBodyBytes += got;
 
     if (_receivedBodyBytes == _bodySize) {
-      var body = _body;
+      var body = _body!;
 
       _bodySize = 0;
       _body = null;
@@ -134,7 +130,9 @@
 
       var completer = _frameCompleter;
       _frameCompleter = null;
-      completer.complete(Uint8List(0));
+      if (completer != null) {
+        completer.complete(Uint8List(0));
+      }
     } else {
       _registerForReadableBytes();
     }
@@ -154,7 +152,7 @@
       _registerForReadableBytes();
     }
 
-    return _frameCompleter.future;
+    return _frameCompleter!.future;
   }
 
   void _registerForReadableBytes() {
@@ -168,8 +166,9 @@
       _body = null;
       _receivedBodyBytes = 0;
       _frameCompleter = null;
-
-      completer.completeError(e);
+      if (completer != null) {
+        completer.completeError(e);
+      }
     });
   }
 }
diff --git a/lib/dart/lib/src/transport/t_http_transport.dart b/lib/dart/lib/src/transport/t_http_transport.dart
index 71fdb3c..cbd5242 100644
--- a/lib/dart/lib/src/transport/t_http_transport.dart
+++ b/lib/dart/lib/src/transport/t_http_transport.dart
@@ -33,9 +33,9 @@
   final THttpConfig config;
 
   THttpClientTransport(this.httpClient, this.config) {
-    if (httpClient == null) {
+    /*if (httpClient == null) {
       throw ArgumentError.notNull("httpClient");
-    }
+    }*/
   }
 
   @override
@@ -75,11 +75,11 @@
 class THttpConfig {
   final Uri url;
 
-  Map<String, String> _headers;
+  late Map<String, String> _headers;
   Map<String, String> get headers => _headers;
 
   THttpConfig(this.url, Map<String, String> headers) {
-    if (url == null || !url.hasAuthority) {
+    if (!url.hasAuthority) {
       throw ArgumentError("Invalid url");
     }
 
@@ -89,9 +89,7 @@
   void _initHeaders(Map<String, String> initial) {
     var h = {};
 
-    if (initial != null) {
       h.addAll(initial);
-    }
 
     h['Content-Type'] = 'application/x-thrift';
     h['Accept'] = 'application/x-thrift';
diff --git a/lib/dart/lib/src/transport/t_message_reader.dart b/lib/dart/lib/src/transport/t_message_reader.dart
index 620a27a..afef386 100644
--- a/lib/dart/lib/src/transport/t_message_reader.dart
+++ b/lib/dart/lib/src/transport/t_message_reader.dart
@@ -45,9 +45,9 @@
 class _TMessageReaderTransport extends TTransport {
   _TMessageReaderTransport();
 
-  Iterator<int> _readIterator;
+  Iterator<int>? _readIterator;
 
-  void reset(Uint8List bytes, [int offset = 0]) {
+  void reset(Uint8List? bytes, [int offset = 0]) {
     if (bytes == null) {
       _readIterator = null;
       return;
@@ -57,11 +57,7 @@
       throw ArgumentError("The offset exceeds the bytes length");
     }
 
-    _readIterator = bytes.iterator;
-
-    for (var i = 0; i < offset; i++) {
-      _readIterator.moveNext();
-    }
+    _readIterator = bytes.skip(offset).iterator;
   }
 
   @override
@@ -75,9 +71,6 @@
 
   @override
   int read(Uint8List buffer, int offset, int length) {
-    if (buffer == null) {
-      throw ArgumentError.notNull("buffer");
-    }
 
     if (offset + length > buffer.length) {
       throw ArgumentError("The range exceeds the buffer length");
@@ -88,8 +81,8 @@
     }
 
     int i = 0;
-    while (i < length && _readIterator.moveNext()) {
-      buffer[offset + i] = _readIterator.current;
+    while (i < length && _readIterator!.moveNext()) {
+      buffer[offset + i] = _readIterator!.current;
       i++;
     }
 
diff --git a/lib/dart/lib/src/transport/t_socket_transport.dart b/lib/dart/lib/src/transport/t_socket_transport.dart
index d9929c8..b568a8b 100644
--- a/lib/dart/lib/src/transport/t_socket_transport.dart
+++ b/lib/dart/lib/src/transport/t_socket_transport.dart
@@ -34,10 +34,6 @@
 
   /// A transport using the provided [socket].
   TSocketTransport(this.socket) {
-    if (socket == null) {
-      throw ArgumentError.notNull('socket');
-    }
-
     socket.onError.listen((e) => logger.warning(e));
     socket.onMessage.listen(handleIncomingMessage);
   }
@@ -96,7 +92,7 @@
 
     if (_completers.isNotEmpty) {
       var completer = _completers.removeAt(0);
-      completer.complete();
+      completer.complete(Uint8List(0));
     }
   }
 }
@@ -134,15 +130,13 @@
     var completer = Completer<Uint8List>.sync();
     _completers[seqid] = completer;
 
-    if (responseTimeout != null) {
-      Future.delayed(responseTimeout, () {
-        var completer = _completers.remove(seqid);
-        if (completer != null) {
-          completer.completeError(
-              TimeoutException("Response timed out.", responseTimeout));
-        }
-      });
-    }
+    Future.delayed(responseTimeout, () {
+      var completer = _completers.remove(seqid);
+      if (completer != null) {
+        completer.completeError(
+            TimeoutException("Response timed out.", responseTimeout));
+      }
+    });
 
     socket.send(bytes);
 
@@ -156,7 +150,7 @@
     TMessage message = messageReader.readMessage(messageBytes);
     var completer = _completers.remove(message.seqid);
     if (completer != null) {
-      completer.complete();
+      completer.complete(Uint8List(0));
     }
   }
 }
diff --git a/lib/dart/pubspec.yaml b/lib/dart/pubspec.yaml
index 732e553..c05d3d1 100644
--- a/lib/dart/pubspec.yaml
+++ b/lib/dart/pubspec.yaml
@@ -24,20 +24,20 @@
 documentation: http://thrift.apache.org
 
 environment:
-  sdk: ">=2.0.0 <3.0.0"
+  sdk: ">=2.12.0 <4.0.0"
 
 dependencies:
   fixnum: ">=0.10.2 <2.0.0"
-  http: ">=0.11.3 <0.14.0"
+  http: "^1.2.0"
   logging: ">=0.11.0 <2.0.0"
 
 dev_dependencies:
   build_runner: ">=1.7.1 <3.0.0"
   build_test: ">=0.10.9 <3.0.0"
-  build_vm_compilers: ^1.0.3
-  build_web_compilers: ">=2.7.1 <4.0.0"
-  dart_dev: ^3.0.0
-  dart_style: ">=1.3.1 <3.0.0"
+  build_vm_compilers: ^1.0.13
+  build_web_compilers: ^3.2.7
+  dart_dev: ^4.1.0
+  dart_style: ^2.3.0
   mockito: ">=4.1.1 <6.0.0"
   test: ^1.9.1
   workiva_analysis_options: ^1.0.0
\ No newline at end of file
diff --git a/lib/dart/test/protocol/t_protocol_test.dart b/lib/dart/test/protocol/t_protocol_test.dart
index 15d973c..4b6ca09 100644
--- a/lib/dart/test/protocol/t_protocol_test.dart
+++ b/lib/dart/test/protocol/t_protocol_test.dart
@@ -15,6 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
+
 library thrift.test.transport.t_json_protocol_test;
 
 import 'dart:async';
@@ -27,7 +28,7 @@
 void main() {
   final message = TMessage('my message', TMessageType.ONEWAY, 123);
 
-  TProtocol protocol;
+  late TProtocol protocol;
 
   Primitive getPrimitive(int tType) {
     switch (tType) {
@@ -69,7 +70,7 @@
     expect(output, input);
   }
 
-  Future primitiveNullTest(Primitive primitive) async {
+  /*Future primitiveNullTest(Primitive primitive) async {
     primitive.write(null);
     protocol.writeMessageEnd();
 
@@ -79,7 +80,7 @@
     var output = primitive.read();
 
     expect(output, primitive.defaultValue);
-  }
+  }*/
 
   var sharedTests = () {
     test('Test message', () async {
@@ -179,61 +180,61 @@
     test('Test bool', () async {
       await primitiveTest(getPrimitive(TType.BOOL), true);
     });
-
+/*
     test('Test bool null', () async {
       await primitiveNullTest(getPrimitive(TType.BOOL));
     });
-
+*/
     test('Test byte', () async {
       await primitiveTest(getPrimitive(TType.BYTE), 64);
     });
-
+/*
     test('Test byte null', () async {
       await primitiveNullTest(getPrimitive(TType.BYTE));
     });
-
+*/
     test('Test I16', () async {
       await primitiveTest(getPrimitive(TType.I16), 32767);
     });
-
+/*
     test('Test I16 null', () async {
       await primitiveNullTest(getPrimitive(TType.I16));
     });
-
+*/
     test('Test I32', () async {
       await primitiveTest(getPrimitive(TType.I32), 2147483647);
     });
-
+/*
     test('Test I32 null', () async {
       await primitiveNullTest(getPrimitive(TType.I32));
     });
-
+*/
     test('Test I64', () async {
       await primitiveTest(getPrimitive(TType.I64), 9223372036854775807);
     });
-
+/*
     test('Test I64 null', () async {
       await primitiveNullTest(getPrimitive(TType.I64));
     });
-
+*/
     test('Test double', () async {
       await primitiveTest(getPrimitive(TType.DOUBLE), 3.1415926);
     });
-
+/*
     test('Test double null', () async {
       await primitiveNullTest(getPrimitive(TType.DOUBLE));
     });
-
+*/
     test('Test string', () async {
       var input = 'There are only two hard things in computer science: '
           'cache invalidation, naming things, and off-by-one errors.';
       await primitiveTest(getPrimitive(TType.STRING), input);
     });
-
+/*
     test('Test string null', () async {
       await primitiveNullTest(getPrimitive(TType.STRING));
     });
-
+*/
     test('Test binary', () async {
       var input = Uint8List.fromList(List.filled(100, 123));
 
diff --git a/lib/dart/test/serializer/serializer_test.dart b/lib/dart/test/serializer/serializer_test.dart
index 89883cb..33df024 100644
--- a/lib/dart/test/serializer/serializer_test.dart
+++ b/lib/dart/test/serializer/serializer_test.dart
@@ -25,9 +25,9 @@
 
 void main() {
   var serializer = () {
-    TDeserializer deserializer;
-    TSerializer serializer;
-    TestTObject testTObject;
+    TDeserializer deserializer = TDeserializer();
+    TSerializer serializer = TSerializer();
+    TestTObject testTObject = TestTObject();
 
     setUp(() {
       serializer = TSerializer();
@@ -39,7 +39,7 @@
       testTObject.d = 15.25;
       testTObject.i = 10;
 
-      var testList = List<String>();
+      var testList = <String>[];
       testList.add("TEST 1");
       testList.add("TEST 2");
 
diff --git a/lib/dart/test/serializer/serializer_test_data.dart b/lib/dart/test/serializer/serializer_test_data.dart
index fc488f4..f5580ff 100644
--- a/lib/dart/test/serializer/serializer_test_data.dart
+++ b/lib/dart/test/serializer/serializer_test_data.dart
@@ -30,15 +30,15 @@
   static final TField _L_FIELD_DESC = TField("l", TType.LIST, 4);
   static final TField _B_FIELD_DESC = TField("b", TType.BOOL, 5);
 
-  int _i;
+  int? _i;
   static const int I = 1;
-  double _d;
+  double? _d;
   static const int D = 2;
-  String _s;
+  String? _s;
   static const int S = 3;
-  List<String> _l;
+  List<String>? _l;
   static const int L = 4;
-  bool _b;
+  bool? _b;
   static const int B = 5;
 
   bool __isset_i = false;
@@ -48,9 +48,9 @@
   TestTObject();
 
   // i
-  int get i => this._i;
+  int? get i => this._i;
 
-  set i(int i) {
+  set i(int? i) {
     this._i = i;
     this.__isset_i = true;
   }
@@ -62,9 +62,9 @@
   }
 
   // d
-  double get d => this._d;
+  double? get d => this._d;
 
-  set d(double d) {
+  set d(double? d) {
     this._d = d;
     this.__isset_d = true;
   }
@@ -76,9 +76,9 @@
   }
 
   // s
-  String get s => this._s;
+  String? get s => this._s;
 
-  set s(String s) {
+  set s(String? s) {
     this._s = s;
   }
 
@@ -89,9 +89,9 @@
   }
 
   // l
-  List<String> get l => this._l;
+  List<String>? get l => this._l;
 
-  set l(List<String> l) {
+  set l(List<String>? l) {
     this._l = l;
   }
 
@@ -102,9 +102,9 @@
   }
 
   // b
-  bool get b => this._b;
+  bool? get b => this._b;
 
-  set b(bool b) {
+  set b(bool? b) {
     this._b = b;
     this.__isset_b = true;
   }
@@ -134,13 +134,13 @@
   }
 
   @override
-  setFieldValue(int fieldID, Object value) {
+  setFieldValue(int fieldID, Object? value) {
     switch (fieldID) {
       case I:
         if (value == null) {
           unsetI();
         } else {
-          this.i = value;
+          this.i = value as int;
         }
         break;
 
@@ -148,7 +148,7 @@
         if (value == null) {
           unsetD();
         } else {
-          this.d = value;
+          this.d = value as double;
         }
         break;
 
@@ -156,7 +156,7 @@
         if (value == null) {
           unsetS();
         } else {
-          this.s = value;
+          this.s = value as String;
         }
         break;
 
@@ -172,7 +172,7 @@
         if (value == null) {
           unsetB();
         } else {
-          this.b = value;
+          this.b = value as bool;
         }
         break;
 
@@ -237,11 +237,11 @@
           if (field.type == TType.LIST) {
             {
               TList _list74 = iprot.readListBegin();
-              this.l = List<String>();
+              this.l = <String>[];
               for (int _i75 = 0; _i75 < _list74.length; ++_i75) {
                 String _elem76;
                 _elem76 = iprot.readString();
-                this.l.add(_elem76);
+                this.l?.add(_elem76);
               }
               iprot.readListEnd();
             }
@@ -275,21 +275,21 @@
 
     oprot.writeStructBegin(_STRUCT_DESC);
     oprot.writeFieldBegin(_I_FIELD_DESC);
-    oprot.writeI32(this.i);
+    oprot.writeI32(this.i!);
     oprot.writeFieldEnd();
     oprot.writeFieldBegin(_D_FIELD_DESC);
-    oprot.writeDouble(this.d);
+    oprot.writeDouble(this.d!);
     oprot.writeFieldEnd();
     if (this.s != null) {
       oprot.writeFieldBegin(_S_FIELD_DESC);
-      oprot.writeString(this.s);
+      oprot.writeString(this.s!);
       oprot.writeFieldEnd();
     }
     if (this.l != null) {
       oprot.writeFieldBegin(_L_FIELD_DESC);
       {
-        oprot.writeListBegin(TList(TType.STRING, this.l.length));
-        for (var elem77 in this.l) {
+        oprot.writeListBegin(TList(TType.STRING, this.l!.length));
+        for (var elem77 in this.l!) {
           oprot.writeString(elem77);
         }
         oprot.writeListEnd();
@@ -297,7 +297,7 @@
       oprot.writeFieldEnd();
     }
     oprot.writeFieldBegin(_B_FIELD_DESC);
-    oprot.writeBool(this.b);
+    oprot.writeBool(this.b!);
     oprot.writeFieldEnd();
     oprot.writeFieldStop();
     oprot.writeStructEnd();
diff --git a/lib/dart/test/t_application_error_test.dart b/lib/dart/test/t_application_error_test.dart
index 848ce56..cecefc7 100644
--- a/lib/dart/test/t_application_error_test.dart
+++ b/lib/dart/test/t_application_error_test.dart
@@ -21,7 +21,7 @@
 import 'package:thrift/thrift.dart';
 
 void main() {
-  TProtocol protocol;
+  late TProtocol protocol;
 
   setUp(() {
     protocol = TBinaryProtocol(TBufferedTransport());
diff --git a/lib/dart/test/transport/t_framed_transport_test.dart b/lib/dart/test/transport/t_framed_transport_test.dart
index d9a15a5..a028c6f 100644
--- a/lib/dart/test/transport/t_framed_transport_test.dart
+++ b/lib/dart/test/transport/t_framed_transport_test.dart
@@ -28,10 +28,10 @@
   group('TFramedTransport partial reads', () {
     final flushAwaitDuration = Duration(seconds: 10);
 
-    FakeReadOnlySocket socket;
-    TSocketTransport socketTransport;
-    TFramedTransport transport;
-    var messageAvailable;
+    late FakeReadOnlySocket socket;
+    late TSocketTransport socketTransport;
+    late TFramedTransport transport;
+    late bool messageAvailable;
 
     setUp(() {
       socket = FakeReadOnlySocket();
diff --git a/lib/dart/test/transport/t_http_transport_test.dart b/lib/dart/test/transport/t_http_transport_test.dart
index 13f0ee9..d0d91f4 100644
--- a/lib/dart/test/transport/t_http_transport_test.dart
+++ b/lib/dart/test/transport/t_http_transport_test.dart
@@ -34,8 +34,8 @@
   const utf8Codec = Utf8Codec();
 
   group('THttpClientTransport', () {
-    FakeHttpClient client;
-    THttpClientTransport transport;
+    late FakeHttpClient client;
+    late THttpClientTransport transport;
 
     setUp(() {
       client = FakeHttpClient(sync: false);
@@ -78,8 +78,8 @@
   });
 
   group('THttpClientTransport with multiple messages', () {
-    FakeHttpClient client;
-    THttpClientTransport transport;
+    late FakeHttpClient client;
+    late THttpClientTransport transport;
 
     setUp(() {
       client = FakeHttpClient(sync: true);
@@ -88,7 +88,7 @@
     });
 
     test('Test read correct buffer after flush', () async {
-      String bufferText;
+      String bufferText= "";
       var expectedText = 'response 1';
       var expectedBytes = utf8Codec.encode(expectedText);
 
@@ -124,8 +124,8 @@
 
   @override
   Future<Response> post(url,
-      {Map<String, String> headers, body, Encoding encoding}) {
-    postRequest = body;
+      {Map<String, String>? headers, body, Encoding? encoding}) {
+    postRequest = body.toString();
     var response = Response(postResponse, 200);
 
     if (sync) {
@@ -136,33 +136,34 @@
   }
 
   @override
-  Future<Response> head(url, {Map<String, String> headers}) =>
+  Future<Response> head(url, {Map<String, String>? headers}) =>
       throw UnimplementedError();
 
   @override
-  Future<Response> get(url, {Map<String, String> headers}) =>
+  Future<Response> get(url, {Map<String, String>? headers}) =>
       throw UnimplementedError();
 
   @override
   Future<Response> put(url,
-          {Map<String, String> headers, body, Encoding encoding}) =>
+          {Map<String, String>? headers, body, Encoding? encoding}) =>
       throw UnimplementedError();
 
   @override
   Future<Response> patch(url,
-          {Map<String, String> headers, body, Encoding encoding}) =>
+          {Map<String, String>? headers, body, Encoding? encoding}) =>
       throw UnimplementedError();
 
   @override
-  Future<Response> delete(url, {Map<String, String> headers}) =>
+  Future<Response> delete(Uri url,
+          {Map<String, String>? headers, Object? body, Encoding? encoding}) =>
       throw UnimplementedError();
 
   @override
-  Future<String> read(url, {Map<String, String> headers}) =>
+  Future<String> read(url, {Map<String, String>? headers}) =>
       throw UnimplementedError();
 
   @override
-  Future<Uint8List> readBytes(url, {Map<String, String> headers}) =>
+  Future<Uint8List> readBytes(url, {Map<String, String>? headers}) =>
       throw UnimplementedError();
 
   @override
diff --git a/lib/dart/test/transport/t_socket_transport_test.dart b/lib/dart/test/transport/t_socket_transport_test.dart
index d46f5ed..80edb68 100644
--- a/lib/dart/test/transport/t_socket_transport_test.dart
+++ b/lib/dart/test/transport/t_socket_transport_test.dart
@@ -39,8 +39,8 @@
   final framedResponseBase64 = base64.encode(_getFramedResponse(responseBytes));
 
   group('TClientSocketTransport', () {
-    FakeSocket socket;
-    TTransport transport;
+    late FakeSocket socket;
+    late TTransport transport;
 
     setUp(() async {
       socket = FakeSocket(sync: false);
@@ -74,8 +74,8 @@
   }, timeout: Timeout(Duration(seconds: 1)));
 
   group('TClientSocketTransport with FramedTransport', () {
-    FakeSocket socket;
-    TTransport transport;
+    late FakeSocket socket;
+    late TTransport transport;
 
     setUp(() async {
       socket = FakeSocket(sync: true);
@@ -87,7 +87,7 @@
     });
 
     test('Test client sending data over framed transport', () async {
-      String bufferText;
+      String bufferText = "";
 
       Future responseReady = transport.flush().then((_) {
         var buffer = Uint8List(responseBytes.length);
@@ -104,9 +104,9 @@
   }, timeout: Timeout(Duration(seconds: 1)));
 
   group('TAsyncClientSocketTransport', () {
-    FakeSocket socket;
-    FakeProtocolFactory protocolFactory;
-    TTransport transport;
+    late FakeSocket socket;
+    late FakeProtocolFactory protocolFactory;
+    late TTransport transport;
 
     setUp(() async {
       socket = FakeSocket(sync: true);
@@ -122,7 +122,7 @@
     });
 
     test('Test response correlates to correct request', () async {
-      String bufferText;
+      String bufferText = "";
 
       Future responseReady = transport.flush().then((_) {
         var buffer = Uint8List(responseBytes.length);
@@ -152,9 +152,9 @@
   }, timeout: Timeout(Duration(seconds: 1)));
 
   group('TAsyncClientSocketTransport with TFramedTransport', () {
-    FakeSocket socket;
-    FakeProtocolFactory protocolFactory;
-    TTransport transport;
+    late FakeSocket socket;
+    late FakeProtocolFactory protocolFactory;
+    late TTransport transport;
 
     setUp(() async {
       socket = FakeSocket(sync: true);
@@ -173,7 +173,7 @@
     });
 
     test('Test async client sending data over framed transport', () async {
-      String bufferText;
+      String bufferText = "";
 
       Future responseReady = transport.flush().then((_) {
         var buffer = Uint8List(responseBytes.length);
@@ -251,7 +251,7 @@
         _onErrorController = StreamController.broadcast(sync: sync),
         _onMessageController = StreamController.broadcast(sync: sync);
 
-  bool _isOpen;
+  bool _isOpen = false;
 
   @override
   bool get isOpen => _isOpen;
@@ -271,8 +271,8 @@
     _onStateController.add(TSocketState.CLOSED);
   }
 
-  Uint8List _sendPayload;
-  Uint8List get sendPayload => _sendPayload;
+  Uint8List? _sendPayload;
+  Uint8List? get sendPayload => _sendPayload;
 
   @override
   void send(Uint8List data) {
@@ -292,7 +292,7 @@
 class FakeProtocolFactory implements TProtocolFactory {
   FakeProtocolFactory();
 
-  TMessage message;
+  TMessage message = TMessage("", TMessageType.CALL, 0 /* seqid */);
 
   @override
   getProtocol(TTransport transport) => FakeProtocol(message);
diff --git a/lib/dart/test/transport/t_transport_test.dart b/lib/dart/test/transport/t_transport_test.dart
index 4758593..e60f61d 100644
--- a/lib/dart/test/transport/t_transport_test.dart
+++ b/lib/dart/test/transport/t_transport_test.dart
@@ -25,16 +25,19 @@
   group('TTransportFactory', () {
     test('transport is returned from base factory', () async {
       TTransport result;
-      TTransport transport;
+      TTransport? transport;
 
       var factory = TTransportFactory();
 
-      result = await factory.getTransport(transport);
-      expect(result, isNull);
+      try {
+        result = await factory.getTransport(transport!);
+        expect(result, isNull);
+      } catch (e) {
+        expect(e, isA<TypeError>());
+      }
 
-      transport = TBufferedTransport();
+      transport = TBufferedTransport()..open();
       result = await factory.getTransport(transport);
-
       expect(result, transport);
     });
   });
