Avoid a few non-null assertions in inspector (#8862)

diff --git a/packages/devtools_app/lib/src/screens/inspector/inspector_data_models.dart b/packages/devtools_app/lib/src/screens/inspector/inspector_data_models.dart
index 618bd65..4d52c28 100644
--- a/packages/devtools_app/lib/src/screens/inspector/inspector_data_models.dart
+++ b/packages/devtools_app/lib/src/screens/inspector/inspector_data_models.dart
@@ -634,10 +634,10 @@
             size: Size(widths[i], heights[i]),
             offset: Offset.zero,
             realSize: displayChildren[i].size,
+            layoutProperties: displayChildren[i],
           )
           ..mainAxisOffset = calculateMainAxisOffset(i)
-          ..crossAxisOffset = calculateCrossAxisOffset(i)
-          ..layoutProperties = displayChildren[i],
+          ..crossAxisOffset = calculateCrossAxisOffset(i),
       );
     }
 
@@ -645,16 +645,18 @@
     final actualLeadingSpace = leadingSpace(freeSpace);
     final actualBetweenSpace = betweenSpace(freeSpace);
     final renderPropsWithFullCrossAxisDimension =
-        RenderProperties(axis: direction)
+        RenderProperties(
+            axis: direction,
+            isFreeSpace: true,
+            layoutProperties: this,
+          )
           ..crossAxisDimension = maxSizeAvailable(crossAxisDirection)
           ..crossAxisRealDimension = dimension(crossAxisDirection)
-          ..crossAxisOffset = 0.0
-          ..isFreeSpace = true
-          ..layoutProperties = this;
+          ..crossAxisOffset = 0.0;
     if (actualLeadingSpace > 0.0 &&
         displayMainAxisAlignment != MainAxisAlignment.start) {
       spaces.add(
-        renderPropsWithFullCrossAxisDimension.clone()
+        renderPropsWithFullCrossAxisDimension.copyWith()
           ..mainAxisOffset = 0.0
           ..mainAxisDimension = renderLeadingSpace
           ..mainAxisRealDimension = actualLeadingSpace,
@@ -664,7 +666,7 @@
       for (var i = 0; i < childrenRenderProps.length - 1; ++i) {
         final child = childrenRenderProps[i];
         spaces.add(
-          renderPropsWithFullCrossAxisDimension.clone()
+          renderPropsWithFullCrossAxisDimension.copyWith()
             ..mainAxisDimension = renderBetweenSpace
             ..mainAxisRealDimension = actualBetweenSpace
             ..mainAxisOffset = child.mainAxisOffset + child.mainAxisDimension,
@@ -674,7 +676,7 @@
     if (actualLeadingSpace > 0.0 &&
         displayMainAxisAlignment != MainAxisAlignment.end) {
       spaces.add(
-        renderPropsWithFullCrossAxisDimension.clone()
+        renderPropsWithFullCrossAxisDimension.copyWith()
           ..mainAxisOffset =
               childrenRenderProps.last.mainAxisDimension +
               childrenRenderProps.last.mainAxisOffset
@@ -700,7 +702,7 @@
       }
 
       final renderProperties = childrenRenderProperties[i];
-      final space = renderProperties.clone()..isFreeSpace = true;
+      final space = renderProperties.copyWith(isFreeSpace: true);
 
       space.crossAxisRealDimension =
           crossAxisDimension - space.crossAxisRealDimension;
@@ -711,9 +713,9 @@
         space.crossAxisDimension *= 0.5;
         final crossAxisRealDimension = space.crossAxisRealDimension;
         space.crossAxisRealDimension = crossAxisRealDimension * 0.5;
-        spaces.add(space.clone()..crossAxisOffset = 0.0);
+        spaces.add(space.copyWith()..crossAxisOffset = 0.0);
         spaces.add(
-          space.clone()
+          space.copyWith()
             ..crossAxisOffset =
                 renderProperties.crossAxisDimension +
                 renderProperties.crossAxisOffset,
@@ -741,15 +743,15 @@
   static final _textBaselineNamesToValues = TextBaseline.values.asNameMap();
 }
 
-/// RenderProperties contains information for rendering a [LayoutProperties] node
+/// Information for rendering a [LayoutProperties] node.
 class RenderProperties {
   RenderProperties({
     required this.axis,
+    required this.layoutProperties,
+    this.isFreeSpace = false,
     Size? size,
     Offset? offset,
     Size? realSize,
-    this.layoutProperties,
-    this.isFreeSpace = false,
   }) : width = size?.width ?? 0.0,
        height = size?.height ?? 0.0,
        realWidth = realSize?.width ?? 0.0,
@@ -759,15 +761,15 @@
 
   final Axis axis;
 
-  /// represents which node is rendered for this object.
-  LayoutProperties? layoutProperties;
+  /// Represents which node is rendered for this object.
+  final LayoutProperties layoutProperties;
+
+  final bool isFreeSpace;
 
   double dx, dy;
   double width, height;
   double realWidth, realHeight;
 
-  bool isFreeSpace;
-
   Size get size => Size(width, height);
 
   Size get realSize => Size(realWidth, realHeight);
@@ -836,14 +838,14 @@
     }
   }
 
-  RenderProperties clone() {
+  RenderProperties copyWith({bool? isFreeSpace}) {
     return RenderProperties(
       axis: axis,
       size: size,
       offset: offset,
       realSize: realSize,
       layoutProperties: layoutProperties,
-      isFreeSpace: isFreeSpace,
+      isFreeSpace: isFreeSpace ?? this.isFreeSpace,
     );
   }
 
diff --git a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/flex/flex.dart b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/flex/flex.dart
index 50d81cf..4980a44 100644
--- a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/flex/flex.dart
+++ b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/flex/flex.dart
@@ -590,8 +590,7 @@
   // TODO(polina-c, jacob314): consider refactoring to remove `!`.
   FlexLayoutProperties get root => state.properties!;
 
-  // TODO(polina-c, jacob314): consider refactoring to remove `!`.
-  LayoutProperties get properties => renderProperties.layoutProperties!;
+  LayoutProperties get properties => renderProperties.layoutProperties;
 
   ObjectGroup? get objectGroup =>
       properties.node.objectGroupApi as ObjectGroup?;
diff --git a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/flex/utils.dart b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/flex/utils.dart
index 66b9bc8..482152d 100644
--- a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/flex/utils.dart
+++ b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/flex/utils.dart
@@ -64,10 +64,9 @@
           offset: Offset.lerp(beginProps.offset, endProps.offset, t),
           size: Size.lerp(beginProps.size, endProps.size, t),
           realSize: Size.lerp(beginProps.realSize, endProps.realSize, t),
-          // TODO(polina-c, jacob314): crnsider refactoring to get rid of `!`.
           layoutProperties: AnimatedLayoutProperties(
-            beginProps.layoutProperties!,
-            endProps.layoutProperties!,
+            beginProps.layoutProperties,
+            endProps.layoutProperties,
             animation,
           ),
         ),
diff --git a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/free_space.dart b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/free_space.dart
index e540912..8f4c7e0 100644
--- a/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/free_space.dart
+++ b/packages/devtools_app/lib/src/screens/inspector/layout_explorer/ui/free_space.dart
@@ -23,7 +23,7 @@
         'h=${toStringAsFixed(renderProperties.realHeight)}';
     final widthDescription = 'w=${toStringAsFixed(renderProperties.realWidth)}';
     final showWidth =
-        renderProperties.realWidth != renderProperties.layoutProperties?.width;
+        renderProperties.realWidth != renderProperties.layoutProperties.width;
     final widthWidget = Column(
       mainAxisAlignment: MainAxisAlignment.center,
       children: [
diff --git a/packages/devtools_app/lib/src/screens/inspector_v2/inspector_data_models.dart b/packages/devtools_app/lib/src/screens/inspector_v2/inspector_data_models.dart
index 7b16198..b9c5ba8 100644
--- a/packages/devtools_app/lib/src/screens/inspector_v2/inspector_data_models.dart
+++ b/packages/devtools_app/lib/src/screens/inspector_v2/inspector_data_models.dart
@@ -728,10 +728,10 @@
             size: Size(widths[i], heights[i]),
             offset: Offset.zero,
             realSize: displayChildren[i].size,
+            layoutProperties: displayChildren[i],
           )
           ..mainAxisOffset = calculateMainAxisOffset(i)
-          ..crossAxisOffset = calculateCrossAxisOffset(i)
-          ..layoutProperties = displayChildren[i],
+          ..crossAxisOffset = calculateCrossAxisOffset(i),
       );
     }
 
@@ -739,16 +739,18 @@
     final actualLeadingSpace = leadingSpace(freeSpace);
     final actualBetweenSpace = betweenSpace(freeSpace);
     final renderPropsWithFullCrossAxisDimension =
-        RenderProperties(axis: direction)
+        RenderProperties(
+            axis: direction,
+            isFreeSpace: true,
+            layoutProperties: this,
+          )
           ..crossAxisDimension = maxSizeAvailable(crossAxisDirection)
           ..crossAxisRealDimension = dimension(crossAxisDirection)
-          ..crossAxisOffset = 0.0
-          ..isFreeSpace = true
-          ..layoutProperties = this;
+          ..crossAxisOffset = 0.0;
     if (actualLeadingSpace > 0.0 &&
         displayMainAxisAlignment != MainAxisAlignment.start) {
       spaces.add(
-        renderPropsWithFullCrossAxisDimension.clone()
+        renderPropsWithFullCrossAxisDimension.copyWith()
           ..mainAxisOffset = 0.0
           ..mainAxisDimension = renderLeadingSpace
           ..mainAxisRealDimension = actualLeadingSpace,
@@ -758,7 +760,7 @@
       for (var i = 0; i < childrenRenderProps.length - 1; ++i) {
         final child = childrenRenderProps[i];
         spaces.add(
-          renderPropsWithFullCrossAxisDimension.clone()
+          renderPropsWithFullCrossAxisDimension.copyWith()
             ..mainAxisDimension = renderBetweenSpace
             ..mainAxisRealDimension = actualBetweenSpace
             ..mainAxisOffset = child.mainAxisOffset + child.mainAxisDimension,
@@ -768,7 +770,7 @@
     if (actualLeadingSpace > 0.0 &&
         displayMainAxisAlignment != MainAxisAlignment.end) {
       spaces.add(
-        renderPropsWithFullCrossAxisDimension.clone()
+        renderPropsWithFullCrossAxisDimension.copyWith()
           ..mainAxisOffset =
               childrenRenderProps.last.mainAxisDimension +
               childrenRenderProps.last.mainAxisOffset
@@ -794,7 +796,7 @@
       }
 
       final renderProperties = childrenRenderProperties[i];
-      final space = renderProperties.clone()..isFreeSpace = true;
+      final space = renderProperties.copyWith(isFreeSpace: true);
 
       space.crossAxisRealDimension =
           crossAxisDimension - space.crossAxisRealDimension;
@@ -805,9 +807,9 @@
         space.crossAxisDimension *= 0.5;
         final crossAxisRealDimension = space.crossAxisRealDimension;
         space.crossAxisRealDimension = crossAxisRealDimension * 0.5;
-        spaces.add(space.clone()..crossAxisOffset = 0.0);
+        spaces.add(space.copyWith()..crossAxisOffset = 0.0);
         spaces.add(
-          space.clone()
+          space.copyWith()
             ..crossAxisOffset =
                 renderProperties.crossAxisDimension +
                 renderProperties.crossAxisOffset,
@@ -835,15 +837,15 @@
   static final _textBaselineNamesToValues = TextBaseline.values.asNameMap();
 }
 
-/// RenderProperties contains information for rendering a [LayoutProperties] node
+/// Information for rendering a [LayoutProperties] node.
 class RenderProperties {
   RenderProperties({
     required this.axis,
+    required this.layoutProperties,
+    this.isFreeSpace = false,
     Size? size,
     Offset? offset,
     Size? realSize,
-    this.layoutProperties,
-    this.isFreeSpace = false,
   }) : width = size?.width ?? 0.0,
        height = size?.height ?? 0.0,
        realWidth = realSize?.width ?? 0.0,
@@ -853,15 +855,15 @@
 
   final Axis axis;
 
-  /// represents which node is rendered for this object.
-  LayoutProperties? layoutProperties;
+  /// Represents which node is rendered for this object.
+  final LayoutProperties layoutProperties;
+
+  final bool isFreeSpace;
 
   double dx, dy;
   double width, height;
   double realWidth, realHeight;
 
-  bool isFreeSpace;
-
   Size get size => Size(width, height);
 
   Size get realSize => Size(realWidth, realHeight);
@@ -930,14 +932,14 @@
     }
   }
 
-  RenderProperties clone() {
+  RenderProperties copyWith({bool? isFreeSpace}) {
     return RenderProperties(
       axis: axis,
       size: size,
       offset: offset,
       realSize: realSize,
       layoutProperties: layoutProperties,
-      isFreeSpace: isFreeSpace,
+      isFreeSpace: isFreeSpace ?? this.isFreeSpace,
     );
   }
 
diff --git a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/flex/flex.dart b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/flex/flex.dart
index 2c434d8..8b53303 100644
--- a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/flex/flex.dart
+++ b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/flex/flex.dart
@@ -591,8 +591,7 @@
   // TODO(polina-c, jacob314): consider refactoring to remove `!`.
   FlexLayoutProperties get root => state.properties!;
 
-  // TODO(polina-c, jacob314): consider refactoring to remove `!`.
-  LayoutProperties get properties => renderProperties.layoutProperties!;
+  LayoutProperties get properties => renderProperties.layoutProperties;
 
   ObjectGroup? get objectGroup =>
       properties.node.objectGroupApi as ObjectGroup?;
diff --git a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/flex/utils.dart b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/flex/utils.dart
index 1e674dc..14c775f 100644
--- a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/flex/utils.dart
+++ b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/flex/utils.dart
@@ -64,10 +64,9 @@
           offset: Offset.lerp(beginProps.offset, endProps.offset, t),
           size: Size.lerp(beginProps.size, endProps.size, t),
           realSize: Size.lerp(beginProps.realSize, endProps.realSize, t),
-          // TODO(polina-c, jacob314): crnsider refactoring to get rid of `!`.
           layoutProperties: AnimatedLayoutProperties(
-            beginProps.layoutProperties!,
-            endProps.layoutProperties!,
+            beginProps.layoutProperties,
+            endProps.layoutProperties,
             animation,
           ),
         ),
diff --git a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/free_space.dart b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/free_space.dart
index 010f4bb..3d1e679 100644
--- a/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/free_space.dart
+++ b/packages/devtools_app/lib/src/screens/inspector_v2/layout_explorer/ui/free_space.dart
@@ -23,7 +23,7 @@
         'h=${toStringAsFixed(renderProperties.realHeight)}';
     final widthDescription = 'w=${toStringAsFixed(renderProperties.realWidth)}';
     final showWidth =
-        renderProperties.realWidth != renderProperties.layoutProperties?.width;
+        renderProperties.realWidth != renderProperties.layoutProperties.width;
     final widthWidget = Column(
       mainAxisAlignment: MainAxisAlignment.center,
       children: [
diff --git a/packages/devtools_app/test/screens/inspector/layout_explorer/inspector_data_models_test.dart b/packages/devtools_app/test/screens/inspector/layout_explorer/inspector_data_models_test.dart
index 95c0dda..213eb84 100644
--- a/packages/devtools_app/test/screens/inspector/layout_explorer/inspector_data_models_test.dart
+++ b/packages/devtools_app/test/screens/inspector/layout_explorer/inspector_data_models_test.dart
@@ -147,12 +147,14 @@
               size: const Size(250, 250),
               realSize: const Size(50.0, 0.0),
               offset: const Offset(0.0, 125.0),
+              layoutProperties: properties,
             ),
             RenderProperties(
               axis: Axis.horizontal,
               size: const Size(261.5, 500),
               realSize: const Size(75.0, 25.0),
               offset: const Offset(250.0, 0.0),
+              layoutProperties: properties,
             ),
             RenderProperties(
               axis: Axis.horizontal,
@@ -160,6 +162,7 @@
               realSize: const Size(375.0, 25.0),
               offset: const Offset(511.5, 0.0),
               isFreeSpace: true,
+              layoutProperties: properties,
             ),
           ]);
         },
@@ -192,12 +195,14 @@
               size: const Size(261.5, 500.0),
               realSize: const Size(75.0, 25.0),
               offset: const Offset(400.0, 0.0),
+              layoutProperties: properties,
             ),
             RenderProperties(
               axis: Axis.horizontal,
               size: const Size(250.0, 250.0),
               realSize: const Size(50.0, 0.0),
               offset: const Offset(661.5, 125.0),
+              layoutProperties: properties,
             ),
             RenderProperties(
               axis: Axis.horizontal,
@@ -205,6 +210,7 @@
               realSize: const Size(375.0, 25.0),
               offset: const Offset(0.0, 0.0),
               isFreeSpace: true,
+              layoutProperties: properties,
             ),
           ]);
         },
diff --git a/packages/devtools_app/test/screens/inspector_v2/layout_explorer/inspector_data_models_test.dart b/packages/devtools_app/test/screens/inspector_v2/layout_explorer/inspector_data_models_test.dart
index 3991e39..f08c1a1 100644
--- a/packages/devtools_app/test/screens/inspector_v2/layout_explorer/inspector_data_models_test.dart
+++ b/packages/devtools_app/test/screens/inspector_v2/layout_explorer/inspector_data_models_test.dart
@@ -147,12 +147,14 @@
               size: const Size(250, 250),
               realSize: const Size(50.0, 0.0),
               offset: const Offset(0.0, 125.0),
+              layoutProperties: properties,
             ),
             RenderProperties(
               axis: Axis.horizontal,
               size: const Size(261.5, 500),
               realSize: const Size(75.0, 25.0),
               offset: const Offset(250.0, 0.0),
+              layoutProperties: properties,
             ),
             RenderProperties(
               axis: Axis.horizontal,
@@ -160,6 +162,7 @@
               realSize: const Size(375.0, 25.0),
               offset: const Offset(511.5, 0.0),
               isFreeSpace: true,
+              layoutProperties: properties,
             ),
           ]);
         },
@@ -192,12 +195,14 @@
               size: const Size(261.5, 500.0),
               realSize: const Size(75.0, 25.0),
               offset: const Offset(400.0, 0.0),
+              layoutProperties: properties,
             ),
             RenderProperties(
               axis: Axis.horizontal,
               size: const Size(250.0, 250.0),
               realSize: const Size(50.0, 0.0),
               offset: const Offset(661.5, 125.0),
+              layoutProperties: properties,
             ),
             RenderProperties(
               axis: Axis.horizontal,
@@ -205,6 +210,7 @@
               realSize: const Size(375.0, 25.0),
               offset: const Offset(0.0, 0.0),
               isFreeSpace: true,
+              layoutProperties: properties,
             ),
           ]);
         },