- THRIFT-5712 - Added Dart 3 Compatibility
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);
     });
   });