diff --git a/pkgs/dartpad_shared/lib/model.dart b/pkgs/dartpad_shared/lib/model.dart index 6a4976b81..fc88ed7d2 100644 --- a/pkgs/dartpad_shared/lib/model.dart +++ b/pkgs/dartpad_shared/lib/model.dart @@ -29,9 +29,9 @@ class SourceRequest { class AnalysisResponse { final List issues; - final List? imports; + final List imports; - AnalysisResponse({required this.issues, this.imports}); + AnalysisResponse({required this.issues, required this.imports}); factory AnalysisResponse.fromJson(Map json) => _$AnalysisResponseFromJson(json); diff --git a/pkgs/dartpad_shared/lib/model.g.dart b/pkgs/dartpad_shared/lib/model.g.dart index 3135d36ef..ca68d3a3d 100644 --- a/pkgs/dartpad_shared/lib/model.g.dart +++ b/pkgs/dartpad_shared/lib/model.g.dart @@ -22,7 +22,7 @@ AnalysisResponse _$AnalysisResponseFromJson(Map json) => .map((e) => AnalysisIssue.fromJson(e as Map)) .toList(), imports: - (json['imports'] as List?)?.map((e) => e as String).toList(), + (json['imports'] as List).map((e) => e as String).toList(), ); Map _$AnalysisResponseToJson(AnalysisResponse instance) => diff --git a/pkgs/dartpad_ui/lib/model.dart b/pkgs/dartpad_ui/lib/model.dart index e8d7ed871..63a9c72c3 100644 --- a/pkgs/dartpad_ui/lib/model.dart +++ b/pkgs/dartpad_ui/lib/model.dart @@ -42,15 +42,14 @@ abstract class EditorService { } class AppModel { - final ValueNotifier _appIsFlutter = ValueNotifier(null); - bool? _usesPackageWeb; + final ValueNotifier appIsFlutter = ValueNotifier(null); AppType get appType => - _appIsFlutter.value ?? false ? AppType.flutter : AppType.dart; + appIsFlutter.value == true ? AppType.flutter : AppType.dart; final ValueNotifier appReady = ValueNotifier(false); final ValueNotifier> analysisIssues = ValueNotifier([]); - final ValueNotifier> packageImports = ValueNotifier([]); + final ValueNotifier> importUrls = ValueNotifier([]); final ValueNotifier title = ValueNotifier(''); @@ -100,11 +99,16 @@ class AppModel { currentDeltaDill.addListener(updateCanReload); void updateShowReload() { - showReload.value = useNewDDC.value && (_appIsFlutter.value ?? false); + showReload.value = useNewDDC.value && (appIsFlutter.value ?? false); + } + + void updateAppType() { + appIsFlutter.value = hasFlutterImports(importUrls.value); } useNewDDC.addListener(updateShowReload); - _appIsFlutter.addListener(updateShowReload); + appIsFlutter.addListener(updateShowReload); + importUrls.addListener(updateAppType); _splitSubscription = splitDragStateManager.onSplitDragUpdated.listen(( SplitDragState value, @@ -132,10 +136,10 @@ class AppModel { void _recalcLayout() { final hasConsoleText = !consoleNotifier.isEmpty; - final isFlutter = _appIsFlutter.value; - final usesPackageWeb = _usesPackageWeb; + final isFlutter = appIsFlutter.value; + final usesPackageWeb = hasPackageWebImport(importUrls.value); - if (isFlutter == null || usesPackageWeb == null) { + if (isFlutter == null) { _layoutMode.value = LayoutMode.both; } else if (usesPackageWeb) { _layoutMode.value = LayoutMode.both; @@ -524,9 +528,6 @@ class AppServices { required bool isNewDDC, required bool reload, }) { - final appIsFlutter = hasFlutterWebMarker(javaScript, isNewDDC: isNewDDC); - appModel._appIsFlutter.value = appIsFlutter; - appModel._usesPackageWeb = hasPackageWebImport(dartSource); appModel._recalcLayout(); _executionService?.execute( @@ -535,7 +536,7 @@ class AppServices { engineVersion: engineVersion, reload: reload, isNewDDC: isNewDDC, - isFlutter: appIsFlutter, + isFlutter: appModel.appIsFlutter.value ?? false, ); } @@ -551,7 +552,7 @@ class AppServices { SourceRequest(source: appModel.sourceCodeController.text), ); appModel.analysisIssues.value = results.issues; - appModel.packageImports.value = results.imports ?? []; + appModel.importUrls.value = results.imports; } catch (error) { appModel.analysisIssues.value = [ AnalysisIssue( @@ -560,7 +561,7 @@ class AppServices { location: Location(line: 0, column: 0), ), ]; - appModel.packageImports.value = []; + appModel.importUrls.value = []; } } diff --git a/pkgs/dartpad_ui/lib/utils.dart b/pkgs/dartpad_ui/lib/utils.dart index eaee88591..4c55ab934 100644 --- a/pkgs/dartpad_ui/lib/utils.dart +++ b/pkgs/dartpad_ui/lib/utils.dart @@ -36,29 +36,12 @@ RelativeRect calculatePopupMenuPosition( ); } -bool hasFlutterWebMarker(String javaScript, {required bool isNewDDC}) { - const marker1 = 'window.flutterConfiguration'; - if (javaScript.contains(marker1)) { - return true; - } - if (isNewDDC && - javaScript.contains('defineLibrary(') && - javaScript.contains('importLibrary("package:flutter/')) { - return true; - // define('dartpad_main', ['dart_sdk', 'flutter_web'] - } else if (!isNewDDC && - javaScript.contains("define('") && - javaScript.contains("'flutter_web'")) { - return true; - } - - return false; +bool hasFlutterImports(List imports) { + return imports.any((import) => import.startsWith('package:flutter/')); } -bool hasPackageWebImport(String dartSource) { - // TODO(devoncarew): There are better ways to do this. - return dartSource.contains("import 'package:web/") || - dartSource.contains('import "package:web/'); +bool hasPackageWebImport(List imports) { + return imports.any((import) => import.startsWith('package:web/')); } extension ColorExtension on Color {