[DAS] Refactors all wrap with builders to the same implementation

R=pquitslund@google.com

Fixes: https://github.com/dart-lang/sdk/issues/60075
Change-Id: I177830361f080e11321f8bd0c85929ab9b3871ae
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/408860
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Auto-Submit: Felipe Morschel <git@fmorschel.dev>
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 7f9651c..1531fe9 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -56,10 +56,7 @@
 import 'package:analysis_server/src/services/correction/dart/flutter_swap_with_parent.dart';
 import 'package:analysis_server/src/services/correction/dart/flutter_wrap.dart';
 import 'package:analysis_server/src/services/correction/dart/flutter_wrap_builder.dart';
-import 'package:analysis_server/src/services/correction/dart/flutter_wrap_future_builder.dart';
 import 'package:analysis_server/src/services/correction/dart/flutter_wrap_generic.dart';
-import 'package:analysis_server/src/services/correction/dart/flutter_wrap_stream_builder.dart';
-import 'package:analysis_server/src/services/correction/dart/flutter_wrap_value_listenable_builder.dart';
 import 'package:analysis_server/src/services/correction/dart/import_add_show.dart';
 import 'package:analysis_server/src/services/correction/dart/inline_invocation.dart';
 import 'package:analysis_server/src/services/correction/dart/invert_conditional_expression.dart';
@@ -142,11 +139,7 @@
   FlutterRemoveWidget.new,
   FlutterSwapWithChild.new,
   FlutterSwapWithParent.new,
-  FlutterWrapBuilder.new,
-  FlutterWrapFutureBuilder.new,
   FlutterWrapGeneric.new,
-  FlutterWrapStreamBuilder.new,
-  FlutterWrapValueListenableBuilder.new,
   ImportAddShow.new,
   InlineInvocation.new,
   InvertConditionalExpression.new,
@@ -171,6 +164,7 @@
 /// The set of built-in multi-generators used to produce assists.
 const Set<MultiProducerGenerator> _builtInMultiGenerators = {
   FlutterWrap.new,
+  FlutterWrapBuilders.new,
   SurroundWith.new,
 };
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart
index 07865d8..f183bb5 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart
@@ -5,24 +5,49 @@
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/utilities/extensions/flutter.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
-// TODO(bkonyi): share common implementation between the various builder wrappers
-// See https://github.com/dart-lang/sdk/issues/60075
-class FlutterWrapBuilder extends ResolvedCorrectionProducer {
-  FlutterWrapBuilder({required super.context});
+class FlutterWrapBuilders extends MultiCorrectionProducer {
+  FlutterWrapBuilders({required super.context});
+
+  @override
+  Future<List<ResolvedCorrectionProducer>> get producers async {
+    var producers = <ResolvedCorrectionProducer>[];
+    var widgetExpr = node.findWidgetExpression;
+    if (widgetExpr != null) {
+      producers.add(_FlutterWrapBuilder(context: context));
+      producers.add(_FlutterWrapValueListenableBuilder(context: context));
+      producers.add(_FlutterWrapStreamBuilder(context: context));
+      producers.add(_FlutterWrapFutureBuilder(context: context));
+    }
+    return producers;
+  }
+}
+
+abstract class _FlutterBaseWrapBuilder extends ResolvedCorrectionProducer {
+  final List<String> extraBuilderParams;
+  final List<String> extraNamedParams;
+  final String builderName;
+
+  _FlutterBaseWrapBuilder({
+    required super.context,
+    required this.builderName,
+    required this.extraNamedParams,
+    required this.extraBuilderParams,
+  });
 
   @override
   CorrectionApplicability get applicability =>
-          // TODO(applicability): comment on why.
-          CorrectionApplicability
-          .singleLocation;
+      // TODO(applicability): comment on why.
+      CorrectionApplicability.singleLocation;
 
-  @override
-  AssistKind get assistKind => DartAssistKind.FLUTTER_WRAP_BUILDER;
+  bool canWrapOn(TypeImpl typeOrThrow) {
+    return !typeOrThrow.isExactWidgetTypeBuilder;
+  }
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
@@ -30,16 +55,18 @@
     if (widgetExpr == null) {
       return;
     }
-    if (widgetExpr.typeOrThrow.isExactWidgetTypeBuilder) {
+    if (!canWrapOn(widgetExpr.typeOrThrow)) {
       return;
     }
     var widgetSrc = utils.getNodeText(widgetExpr);
 
-    var builderElement = await sessionHelper.getFlutterClass('Builder');
+    var builderElement = await sessionHelper.getFlutterClass(builderName);
     if (builderElement == null) {
       return;
     }
 
+    var params = ['context', ...extraBuilderParams];
+
     await builder.addDartFileEdit(file, (builder) {
       builder.addReplacement(range.node(widgetExpr), (builder) {
         builder.writeReference(builderElement);
@@ -50,8 +77,17 @@
         var indentNew1 = indentOld + utils.oneIndent;
         var indentNew2 = indentOld + utils.twoIndents;
 
+        var namedParams = extraNamedParams.join(', ');
+
+        if (namedParams.isNotEmpty) {
+          builder.write(indentNew1);
+          builder.write('$namedParams: ');
+          builder.addSimpleLinkedEdit('variable', namedParams);
+          builder.writeln(',');
+        }
+
         builder.write(indentNew1);
-        builder.writeln('builder: (context) {');
+        builder.writeln('builder: (${params.join(', ')}) {');
 
         widgetSrc = utils.replaceSourceIndent(widgetSrc, indentOld, indentNew2);
         builder.write(indentNew2);
@@ -69,3 +105,52 @@
     });
   }
 }
+
+class _FlutterWrapBuilder extends _FlutterBaseWrapBuilder {
+  _FlutterWrapBuilder({required super.context})
+    : super(
+        builderName: 'Builder',
+        extraNamedParams: const [],
+        extraBuilderParams: const [],
+      );
+
+  @override
+  AssistKind get assistKind => DartAssistKind.FLUTTER_WRAP_BUILDER;
+}
+
+class _FlutterWrapFutureBuilder extends _FlutterBaseWrapBuilder {
+  _FlutterWrapFutureBuilder({required super.context})
+    : super(
+        builderName: 'FutureBuilder',
+        extraNamedParams: const ['future'],
+        extraBuilderParams: const ['asyncSnapshot'],
+      );
+
+  @override
+  AssistKind get assistKind => DartAssistKind.FLUTTER_WRAP_FUTURE_BUILDER;
+}
+
+class _FlutterWrapStreamBuilder extends _FlutterBaseWrapBuilder {
+  _FlutterWrapStreamBuilder({required super.context})
+    : super(
+        builderName: 'StreamBuilder',
+        extraNamedParams: const ['stream'],
+        extraBuilderParams: const ['asyncSnapshot'],
+      );
+
+  @override
+  AssistKind get assistKind => DartAssistKind.FLUTTER_WRAP_STREAM_BUILDER;
+}
+
+class _FlutterWrapValueListenableBuilder extends _FlutterBaseWrapBuilder {
+  _FlutterWrapValueListenableBuilder({required super.context})
+    : super(
+        builderName: 'ValueListenableBuilder',
+        extraNamedParams: const ['valueListenable'],
+        extraBuilderParams: const ['value', 'child'],
+      );
+
+  @override
+  AssistKind get assistKind =>
+      DartAssistKind.FLUTTER_WRAP_VALUE_LISTENABLE_BUILDER;
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_future_builder.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_future_builder.dart
deleted file mode 100644
index ccb097c..0000000
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_future_builder.dart
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analysis_server/src/services/correction/assist.dart';
-import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
-import 'package:analyzer/src/utilities/extensions/flutter.dart';
-import 'package:analyzer_plugin/utilities/assist/assist.dart';
-import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
-import 'package:analyzer_plugin/utilities/range_factory.dart';
-
-// TODO(bkonyi): share common implementation between the various builder wrappers
-// See https://github.com/dart-lang/sdk/issues/60075
-class FlutterWrapFutureBuilder extends ResolvedCorrectionProducer {
-  FlutterWrapFutureBuilder({required super.context});
-
-  @override
-  CorrectionApplicability get applicability =>
-          // TODO(applicability): comment on why.
-          CorrectionApplicability
-          .singleLocation;
-
-  @override
-  AssistKind get assistKind => DartAssistKind.FLUTTER_WRAP_FUTURE_BUILDER;
-
-  @override
-  Future<void> compute(ChangeBuilder builder) async {
-    var widgetExpr = node.findWidgetExpression;
-    if (widgetExpr == null) {
-      return;
-    }
-    var widgetSrc = utils.getNodeText(widgetExpr);
-
-    var FutureBuilderElement = await sessionHelper.getFlutterClass(
-      'FutureBuilder',
-    );
-    if (FutureBuilderElement == null) {
-      return;
-    }
-
-    await builder.addDartFileEdit(file, (builder) {
-      builder.addReplacement(range.node(widgetExpr), (builder) {
-        builder.writeReference(FutureBuilderElement);
-
-        builder.write('<');
-        builder.addSimpleLinkedEdit('type', 'Object');
-        builder.writeln('>(');
-
-        var indentOld = utils.getLinePrefix(widgetExpr.offset);
-        var indentNew1 = indentOld + utils.oneIndent;
-        var indentNew2 = indentOld + utils.twoIndents;
-
-        builder.write(indentNew1);
-        builder.writeln('future: null,');
-
-        builder.write(indentNew1);
-        builder.writeln('builder: (context, snapshot) {');
-
-        widgetSrc = utils.replaceSourceIndent(widgetSrc, indentOld, indentNew2);
-        builder.write(indentNew2);
-        builder.write('return $widgetSrc');
-        builder.writeln(';');
-
-        builder.write(indentNew1);
-        var addTrailingCommas =
-            getCodeStyleOptions(unitResult.file).addTrailingCommas;
-        builder.writeln('}${addTrailingCommas ? "," : ""}');
-
-        builder.write(indentOld);
-        builder.write(')');
-      });
-    });
-  }
-}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_stream_builder.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_stream_builder.dart
deleted file mode 100644
index 1fb68d2..0000000
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_stream_builder.dart
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analysis_server/src/services/correction/assist.dart';
-import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
-import 'package:analyzer/src/dart/ast/extensions.dart';
-import 'package:analyzer/src/utilities/extensions/flutter.dart';
-import 'package:analyzer_plugin/utilities/assist/assist.dart';
-import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
-import 'package:analyzer_plugin/utilities/range_factory.dart';
-
-// TODO(bkonyi): share common implementation between the various builder wrappers
-// See https://github.com/dart-lang/sdk/issues/60075
-class FlutterWrapStreamBuilder extends ResolvedCorrectionProducer {
-  FlutterWrapStreamBuilder({required super.context});
-
-  @override
-  CorrectionApplicability get applicability =>
-          // TODO(applicability): comment on why.
-          CorrectionApplicability
-          .singleLocation;
-
-  @override
-  AssistKind get assistKind => DartAssistKind.FLUTTER_WRAP_STREAM_BUILDER;
-
-  @override
-  Future<void> compute(ChangeBuilder builder) async {
-    var widgetExpr = node.findWidgetExpression;
-    if (widgetExpr == null) {
-      return;
-    }
-    if (widgetExpr.typeOrThrow.isExactWidgetTypeStreamBuilder) {
-      return;
-    }
-    var widgetSrc = utils.getNodeText(widgetExpr);
-
-    var streamBuilderElement = await sessionHelper.getFlutterClass(
-      'StreamBuilder',
-    );
-    if (streamBuilderElement == null) {
-      return;
-    }
-
-    await builder.addDartFileEdit(file, (builder) {
-      builder.addReplacement(range.node(widgetExpr), (builder) {
-        builder.writeReference(streamBuilderElement);
-
-        builder.write('<');
-        builder.addSimpleLinkedEdit('type', 'Object');
-        builder.writeln('>(');
-
-        var indentOld = utils.getLinePrefix(widgetExpr.offset);
-        var indentNew1 = indentOld + utils.oneIndent;
-        var indentNew2 = indentOld + utils.twoIndents;
-
-        builder.write(indentNew1);
-        builder.writeln('stream: null,');
-
-        builder.write(indentNew1);
-        builder.writeln('builder: (context, snapshot) {');
-
-        widgetSrc = utils.replaceSourceIndent(widgetSrc, indentOld, indentNew2);
-        builder.write(indentNew2);
-        builder.write('return $widgetSrc');
-        builder.writeln(';');
-
-        builder.write(indentNew1);
-        var addTrailingCommas =
-            getCodeStyleOptions(unitResult.file).addTrailingCommas;
-        builder.writeln('}${addTrailingCommas ? "," : ""}');
-
-        builder.write(indentOld);
-        builder.write(')');
-      });
-    });
-  }
-}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_value_listenable_builder.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_value_listenable_builder.dart
deleted file mode 100644
index d52dd51..0000000
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_value_listenable_builder.dart
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analysis_server/src/services/correction/assist.dart';
-import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
-import 'package:analyzer/src/utilities/extensions/flutter.dart';
-import 'package:analyzer_plugin/utilities/assist/assist.dart';
-import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
-import 'package:analyzer_plugin/utilities/range_factory.dart';
-
-// TODO(kenz): share common implementation between the various builder wrappers.
-// See https://github.com/dart-lang/sdk/issues/60075.
-class FlutterWrapValueListenableBuilder extends ResolvedCorrectionProducer {
-  FlutterWrapValueListenableBuilder({required super.context});
-
-  @override
-  CorrectionApplicability get applicability =>
-          // TODO(applicability): comment on why.
-          CorrectionApplicability
-          .singleLocation;
-
-  @override
-  AssistKind get assistKind =>
-      DartAssistKind.FLUTTER_WRAP_VALUE_LISTENABLE_BUILDER;
-
-  @override
-  Future<void> compute(ChangeBuilder builder) async {
-    var widgetExpr = node.findWidgetExpression;
-    if (widgetExpr == null) {
-      return;
-    }
-
-    var widgetSrc = utils.getNodeText(widgetExpr);
-
-    var valueListenableBuilderElement = await sessionHelper.getFlutterClass(
-      'ValueListenableBuilder',
-    );
-    if (valueListenableBuilderElement == null) {
-      return;
-    }
-
-    await builder.addDartFileEdit(file, (builder) {
-      builder.addReplacement(range.node(widgetExpr), (builder) {
-        builder.writeReference(valueListenableBuilderElement);
-
-        builder.write('<');
-        builder.addSimpleLinkedEdit('type', 'Object');
-        builder.writeln('>(');
-
-        var indentOld = utils.getLinePrefix(widgetExpr.offset);
-        var indentNew1 = indentOld + utils.oneIndent;
-        var indentNew2 = indentOld + utils.twoIndents;
-
-        builder.write(indentNew1);
-        builder.writeln('valueListenable: valueListenable,');
-
-        builder.write(indentNew1);
-        // If there is a ValueListenableBuilder above or below the Widget being
-        // added that has a parameter named 'value', then this parameter named
-        // 'value' will take precedence in the scope of this builder. This is a
-        // known risk and is acceptable at this time. It is possible to improve
-        // this logic in the future by looking for naming collisisons above and
-        // below this Widget and giving the parameter a unique name.
-        builder.writeln('builder: (context, value, child) {');
-
-        widgetSrc = utils.replaceSourceIndent(widgetSrc, indentOld, indentNew2);
-        builder.write(indentNew2);
-        builder.write('return $widgetSrc');
-        builder.writeln(';');
-
-        builder.write(indentNew1);
-        var addTrailingCommas =
-            getCodeStyleOptions(unitResult.file).addTrailingCommas;
-        builder.writeln('}${addTrailingCommas ? "," : ""}');
-
-        builder.write(indentOld);
-        builder.write(')');
-      });
-    });
-  }
-}
diff --git a/pkg/analysis_server/test/src/cider/assists_test.dart b/pkg/analysis_server/test/src/cider/assists_test.dart
index 61ca57a..a535d45 100644
--- a/pkg/analysis_server/test/src/cider/assists_test.dart
+++ b/pkg/analysis_server/test/src/cider/assists_test.dart
@@ -77,9 +77,9 @@
 import 'package:flutter/widgets.dart';
 
 void f() {
-  StreamBuilder<Object>(
-    stream: null,
-    builder: (context, snapshot) {
+  StreamBuilder(
+    stream: stream,
+    builder: (context, asyncSnapshot) {
       return Text('a');
     }
   );
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_future_builder_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_future_builder_test.dart
index cfecded..27218aa 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_future_builder_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_future_builder_test.dart
@@ -26,6 +26,19 @@
     writeTestPackageConfig(flutter: true);
   }
 
+  Future<void> test_aroundBuilder() async {
+    await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+
+void f() {
+  ^Builder(
+    builder: (context) => Text(''),
+  );
+}
+''');
+    await assertNoAssist();
+  }
+
   Future<void> test_aroundFutureBuilder() async {
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
@@ -41,9 +54,9 @@
 import 'package:flutter/widgets.dart';
 
 void f(Future<int> s) {
-  FutureBuilder<Object>(
-    future: null,
-    builder: (context, snapshot) {
+  FutureBuilder(
+    future: future,
+    builder: (context, asyncSnapshot) {
       return FutureBuilder(
         future: s,
         builder: (context, snapshot) => Text(''),
@@ -66,9 +79,9 @@
 import 'package:flutter/widgets.dart';
 
 void f() {
-  FutureBuilder<Object>(
-    future: null,
-    builder: (context, snapshot) {
+  FutureBuilder(
+    future: future,
+    builder: (context, asyncSnapshot) {
       return Text('a');
     }
   );
@@ -96,9 +109,9 @@
   const TestWidget({super.key});
   @override
   Widget build(BuildContext context) {
-    return FutureBuilder<Object>(
-      future: null,
-      builder: (context, snapshot) {
+    return FutureBuilder(
+      future: future,
+      builder: (context, asyncSnapshot) {
         return const Text('hi');
       }
     );
@@ -127,9 +140,9 @@
   const TestWidget({super.key});
   @override
   Widget build(BuildContext context) {
-    return FutureBuilder<Object>(
-      future: null,
-      builder: (context, snapshot) {
+    return FutureBuilder(
+      future: future,
+      builder: (context, asyncSnapshot) {
         return const Text('hi');
       },
     );
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
index 36cb8e9..f3aca13 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
@@ -26,6 +26,19 @@
     writeTestPackageConfig(flutter: true);
   }
 
+  Future<void> test_aroundBuilder() async {
+    await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+
+void f(Stream<int> s) {
+  ^Builder(
+    builder: (context) => Text(''),
+  );
+}
+''');
+    await assertNoAssist();
+  }
+
   Future<void> test_aroundStreamBuilder() async {
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
@@ -33,11 +46,25 @@
 void f(Stream<int> s) {
   ^StreamBuilder(
     stream: s,
-    builder: (context, snapshot) => Text(''),
+    builder: (context, asyncSnapshot) => Text(''),
   );
 }
 ''');
-    await assertNoAssist();
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+void f(Stream<int> s) {
+  StreamBuilder(
+    stream: stream,
+    builder: (context, asyncSnapshot) {
+      return StreamBuilder(
+        stream: s,
+        builder: (context, asyncSnapshot) => Text(''),
+      );
+    }
+  );
+}
+''');
   }
 
   Future<void> test_aroundText() async {
@@ -52,9 +79,9 @@
 import 'package:flutter/widgets.dart';
 
 void f() {
-  StreamBuilder<Object>(
-    stream: null,
-    builder: (context, snapshot) {
+  StreamBuilder(
+    stream: stream,
+    builder: (context, asyncSnapshot) {
       return Text('a');
     }
   );
@@ -82,9 +109,9 @@
   const TestWidget({super.key});
   @override
   Widget build(BuildContext context) {
-    return StreamBuilder<Object>(
-      stream: null,
-      builder: (context, snapshot) {
+    return StreamBuilder(
+      stream: stream,
+      builder: (context, asyncSnapshot) {
         return const Text('hi');
       }
     );
@@ -113,9 +140,9 @@
   const TestWidget({super.key});
   @override
   Widget build(BuildContext context) {
-    return StreamBuilder<Object>(
-      stream: null,
-      builder: (context, snapshot) {
+    return StreamBuilder(
+      stream: stream,
+      builder: (context, asyncSnapshot) {
         return const Text('hi');
       },
     );
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_value_listenable_builder_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_value_listenable_builder_test.dart
index 8304343..512a489 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_value_listenable_builder_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_value_listenable_builder_test.dart
@@ -26,6 +26,21 @@
     writeTestPackageConfig(flutter: true);
   }
 
+  Future<void> test_aroundBuilder() async {
+    await resolveTestCode('''
+  import 'package:flutter/widgets.dart';
+
+  void f(ValueListenable<int> v) {
+    ^Builder(
+      builder: (context) {
+        return Text('a');
+      },
+    );
+  }
+  ''');
+    await assertNoAssist();
+  }
+
   Future<void> test_aroundText() async {
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
@@ -38,7 +53,7 @@
 import 'package:flutter/widgets.dart';
 
 void f() {
-  ValueListenableBuilder<Object>(
+  ValueListenableBuilder(
     valueListenable: valueListenable,
     builder: (context, value, child) {
       return Text('a');
@@ -65,7 +80,7 @@
   import 'package:flutter/widgets.dart';
 
   void f(ValueListenable<int> v) {
-    ValueListenableBuilder<Object>(
+    ValueListenableBuilder(
       valueListenable: valueListenable,
       builder: (context, value, child) {
         return ValueListenableBuilder<int>(
@@ -100,7 +115,7 @@
     ValueListenableBuilder<int>(
       valueListenable: v,
       builder: (context, value, _) {
-        return ValueListenableBuilder<Object>(
+        return ValueListenableBuilder(
           valueListenable: valueListenable,
           builder: (context, value, child) {
             return Text('a');
@@ -132,7 +147,7 @@
   const TestWidget({super.key});
   @override
   Widget build(BuildContext context) {
-    return ValueListenableBuilder<Object>(
+    return ValueListenableBuilder(
       valueListenable: valueListenable,
       builder: (context, value, child) {
         return const Text('hi');
@@ -163,7 +178,7 @@
   const TestWidget({super.key});
   @override
   Widget build(BuildContext context) {
-    return ValueListenableBuilder<Object>(
+    return ValueListenableBuilder(
       valueListenable: valueListenable,
       builder: (context, value, child) {
         return const Text('hi');
diff --git a/pkg/analyzer/lib/src/utilities/extensions/flutter.dart b/pkg/analyzer/lib/src/utilities/extensions/flutter.dart
index 3495da2..9544c9b 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/flutter.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/flutter.dart
@@ -21,15 +21,11 @@
 const _nameState = 'State';
 const _nameStatefulWidget = 'StatefulWidget';
 const _nameStatelessWidget = 'StatelessWidget';
-const _nameStreamBuilder = 'StreamBuilder';
 
 const _nameWidget = 'Widget';
 final Uri _uriAlignment = Uri.parse(
   'package:flutter/src/painting/alignment.dart',
 );
-final Uri _uriAsync = Uri.parse(
-  'package:flutter/src/widgets/async.dart',
-);
 final Uri _uriBasic = Uri.parse(
   'package:flutter/src/widgets/basic.dart',
 );
@@ -48,7 +44,6 @@
 final Uri _uriWidgetsIcon = Uri.parse(
   'package:flutter/src/widgets/icon.dart',
 );
-
 final Uri _uriWidgetsText = Uri.parse(
   'package:flutter/src/widgets/text.dart',
 );
@@ -232,7 +227,7 @@
         self.element3._isExactly(_nameAlign, _uriBasic);
   }
 
-  /// Whether this is the Flutter class `StreamBuilder`.
+  /// Whether this is the Flutter class `Builder`.
   bool get isExactWidgetTypeBuilder {
     var self = this;
     return self is InterfaceType &&
@@ -281,13 +276,6 @@
         self.element3._isExactly(_nameSizedBox, _uriBasic);
   }
 
-  /// Whether this is the Flutter class `StreamBuilder`.
-  bool get isExactWidgetTypeStreamBuilder {
-    var self = this;
-    return self is InterfaceType &&
-        self.element3._isExactly(_nameStreamBuilder, _uriAsync);
-  }
-
   /// Whether this is the Flutter class `Widget`, or its subtype.
   bool get isListOfWidgetsType {
     var self = this;