Allow the analytics instance to be created later (#3179)

diff --git a/lib/src/pub_embeddable_command.dart b/lib/src/pub_embeddable_command.dart
index 0403d17..c1fa863 100644
--- a/lib/src/pub_embeddable_command.dart
+++ b/lib/src/pub_embeddable_command.dart
@@ -31,9 +31,15 @@
 class PubAnalytics {
   /// Name of the custom dimension of the dependency kind.
   final String dependencyKindCustomDimensionName;
-  final Analytics analytics;
-  PubAnalytics(this.analytics,
-      {required this.dependencyKindCustomDimensionName});
+
+  final Analytics? Function() _analyticsGetter;
+
+  Analytics? get analytics => _analyticsGetter();
+
+  PubAnalytics(
+    this._analyticsGetter, {
+    required this.dependencyKindCustomDimensionName,
+  });
 }
 
 /// Exposes the `pub` commands as a command to be embedded in another command
diff --git a/lib/src/solver/result.dart b/lib/src/solver/result.dart
index ee5cdc8..8d4e891 100644
--- a/lib/src/solver/result.dart
+++ b/lib/src/solver/result.dart
@@ -129,8 +129,10 @@
   }
 
   /// Send analytics about the package resolution.
-  void sendAnalytics(PubAnalytics analytics) {
-    ArgumentError.checkNotNull(analytics);
+  void sendAnalytics(PubAnalytics pubAnalytics) {
+    ArgumentError.checkNotNull(pubAnalytics);
+    final analytics = pubAnalytics.analytics;
+    if (analytics == null) return;
 
     for (final package in packages) {
       final source = package.source;
@@ -143,21 +145,21 @@
           DependencyType.direct: 'direct',
           DependencyType.none: 'transitive'
         }[_root.dependencyType(package.name)]!;
-        analytics.analytics.sendEvent(
+        analytics.sendEvent(
           'pub-get',
           package.name,
           label: package.version.canonicalizedVersion,
           value: 1,
           parameters: {
             'ni': '1', // We consider a pub-get a non-interactive event.
-            analytics.dependencyKindCustomDimensionName: dependencyKind,
+            pubAnalytics.dependencyKindCustomDimensionName: dependencyKind,
           },
         );
         log.fine(
             'Sending analytics hit for "pub-get" of ${package.name} version ${package.version} as dependency-kind $dependencyKind');
       }
     }
-    analytics.analytics.sendTiming(
+    analytics.sendTiming(
       'resolution',
       resolutionTime.inMilliseconds,
       category: 'pub-get',
diff --git a/tool/test-bin/pub_command_runner.dart b/tool/test-bin/pub_command_runner.dart
index 810c925..52eaf73 100644
--- a/tool/test-bin/pub_command_runner.dart
+++ b/tool/test-bin/pub_command_runner.dart
@@ -14,12 +14,14 @@
 import 'package:pub/src/log.dart' as log;
 import 'package:usage/usage.dart';
 
+final _LoggingAnalytics loggingAnalytics = _LoggingAnalytics();
+
 class Runner extends CommandRunner<int> {
   ArgResults _options;
 
   Runner() : super('pub_command_runner', 'Tests the embeddable pub command.') {
     final analytics = Platform.environment['_PUB_LOG_ANALYTICS'] == 'true'
-        ? PubAnalytics(_LoggingAnalytics(),
+        ? PubAnalytics(() => loggingAnalytics,
             dependencyKindCustomDimensionName: 'cd1')
         : null;
     addCommand(pubCommand(analytics: analytics));