- THRIFT-5712 - Added Dart 3 Compatibility
diff --git a/tutorial/dart/client/pubspec.yaml b/tutorial/dart/client/pubspec.yaml
index a8c148d..4ffaa42 100644
--- a/tutorial/dart/client/pubspec.yaml
+++ b/tutorial/dart/client/pubspec.yaml
@@ -22,7 +22,7 @@
 homepage: http://thrift.apache.org
 
 environment:
-  sdk: ">=1.13.0 <3.0.0"
+  sdk: ">=2.12.0 <4.0.0"
 
 dependencies:
   shared:
diff --git a/tutorial/dart/client/web/client.dart b/tutorial/dart/client/web/client.dart
index 4f02d0d..be5cfe6 100644
--- a/tutorial/dart/client/web/client.dart
+++ b/tutorial/dart/client/web/client.dart
@@ -24,7 +24,7 @@
 
 /// Adapted from the AS3 tutorial
 void main() {
-  new CalculatorUI(querySelector('#output')).start();
+  new CalculatorUI(querySelector('#output') as DivElement ).start();
 }
 
 class CalculatorUI {
@@ -32,8 +32,8 @@
 
   CalculatorUI(this.output);
 
-  TTransport _transport;
-  Calculator _calculatorClient;
+  late TTransport _transport;
+  late Calculator _calculatorClient;
 
   void start() {
     _buildInterface();
@@ -120,12 +120,12 @@
   void _onAddClick(MouseEvent e) {
     _validate();
 
-    InputElement num1 = querySelector("#add1");
-    InputElement num2 = querySelector("#add2");
-    SpanElement result = querySelector("#addResult");
+    InputElement num1 = querySelector("#add1") as InputElement;
+    InputElement num2 = querySelector("#add2")as InputElement;
+    SpanElement result = querySelector("#addResult") as SpanElement;
 
     _calculatorClient
-        .add(int.parse(num1.value), int.parse(num2.value))
+        .add(int.parse(num1.value ?? "0"), int.parse(num2.value ?? "0"))
         .then((int n) {
       result.text = "$n";
     });
@@ -211,21 +211,21 @@
   void _onCalcClick(MouseEvent e) {
     _validate();
 
-    InputElement num1 = querySelector("#calc1");
-    InputElement num2 = querySelector("#calc2");
-    SelectElement op = querySelector("#calcOp");
-    SpanElement result = querySelector("#calcResult");
-    InputElement logId = querySelector("#logId");
-    InputElement comment = querySelector("#comment");
+    InputElement num1 = querySelector("#calc1") as InputElement;
+    InputElement num2 = querySelector("#calc2")as InputElement;
+    SelectElement op = querySelector("#calcOp") as SelectElement;
+    SpanElement result = querySelector("#calcResult") as SpanElement;
+    InputElement logId = querySelector("#logId") as InputElement;
+    InputElement comment = querySelector("#comment") as InputElement;
 
-    int logIdValue = int.parse(logId.value);
+    int logIdValue = int.parse(logId.value ?? "0");
     logId.value = (logIdValue + 1).toString();
 
     Work work = new Work();
-    work.num1 = int.parse(num1.value);
-    work.num2 = int.parse(num2.value);
-    work.op = int.parse(op.options[op.selectedIndex].value);
-    work.comment = comment.value;
+    work.num1 = int.parse(num1.value!);
+    work.num2 = int.parse(num2.value!);
+    work.op = int.parse(op.options[op.selectedIndex!].value);
+    work.comment = comment.value!;
 
     _calculatorClient.calculate(logIdValue, work).then((int n) {
       result.text = "$n";
@@ -266,13 +266,13 @@
   void _onGetStructClick(MouseEvent e) {
     _validate();
 
-    InputElement structKey = querySelector("#structKey");
-    TextAreaElement result = querySelector("#getStructResult");
+    InputElement structKey = querySelector("#structKey") as InputElement;
+    TextAreaElement result = querySelector("#getStructResult") as TextAreaElement;
 
     _calculatorClient
-        .getStruct(int.parse(structKey.value))
-        .then((SharedStruct s) {
-      result.text = "${s.toString()}";
+        .getStruct(int.parse(structKey.value!))
+        .then((SharedStruct? s) {
+      result.text = "${s?.toString()}";
     });
   }
 }