Skip to content

Commit 77b752c

Browse files
committed
Only call flutter create for required platforms when enabling new platforms
Fixes #3423.
1 parent 2641417 commit 77b752c

6 files changed

Lines changed: 27 additions & 15 deletions

File tree

‎src/extension/commands/sdk.ts‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { FlutterCapabilities } from "../../shared/capabilities/flutter";
77
import { vsCodeVersion } from "../../shared/capabilities/vscode";
88
import { dartVMPath, DART_CREATE_PROJECT_TRIGGER_FILE, defaultLaunchJson, flutterPath, iUnderstandAction, pubPath } from "../../shared/constants";
99
import { LogCategory } from "../../shared/enums";
10-
import { CustomScript, DartProjectTemplate, DartSdks, DartWorkspaceContext, FlutterCreateTriggerData, Logger, SpawnedProcess } from "../../shared/interfaces";
10+
import { CustomScript, DartProjectTemplate, DartSdks, DartWorkspaceContext, FlutterCreateCommandArgs, FlutterCreateTriggerData, Logger, SpawnedProcess } from "../../shared/interfaces";
1111
import { logProcess } from "../../shared/logging";
1212
import { nullToUndefined, PromiseCompleter, uniq, usingCustomScript } from "../../shared/utils";
1313
import { sortBy } from "../../shared/utils/array";
@@ -275,7 +275,7 @@ export class SdkCommands {
275275
await util.promptToReloadExtension();
276276
}
277277

278-
private async flutterCreate(projectPath: string | undefined, projectName?: string, triggerData?: FlutterCreateTriggerData) {
278+
private async flutterCreate({ projectName, projectPath, triggerData, platform }: FlutterCreateCommandArgs) {
279279
if (!projectPath) {
280280
projectPath = await getFolderToRunCommandIn(this.logger, `Select the folder to run "flutter create" in`, undefined, true);
281281
if (!projectPath)
@@ -286,6 +286,10 @@ export class SdkCommands {
286286
if (config.flutterCreateOffline) {
287287
args.push("--offline");
288288
}
289+
if (platform) {
290+
args.push("--platforms");
291+
args.push(platform);
292+
}
289293
if (projectName) {
290294
args.push("--project-name");
291295
args.push(projectName);

‎src/extension/user_prompts.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import * as vs from "vscode";
44
import { DART_CREATE_PROJECT_TRIGGER_FILE, flutterExtensionIdentifier, FLUTTER_CREATE_PROJECT_TRIGGER_FILE, installFlutterExtensionPromptKey, isWin, noAction, recommendedSettingsUrl, showRecommendedSettingsAction, useRecommendedSettingsPromptKey, userPromptContextPrefix, yesAction } from "../shared/constants";
55
import { LogCategory } from "../shared/enums";
66
import { WebClient } from "../shared/fetch";
7-
import { DartProjectTemplate, FlutterCreateTriggerData, Logger } from "../shared/interfaces";
7+
import { DartProjectTemplate, FlutterCreateCommandArgs, FlutterCreateTriggerData, Logger } from "../shared/interfaces";
88
import { fsPath } from "../shared/utils/fs";
99
import { checkHasFlutterExtension, extensionVersion, hasFlutterExtension, isDevExtension } from "../shared/vscode/extension_utils";
1010
import { showFlutterSurveyNotificationIfAppropriate } from "../shared/vscode/user_prompts";
@@ -213,7 +213,8 @@ async function createDartProject(projectPath: string, templateName: string): Pro
213213

214214
async function createFlutterProject(projectPath: string, triggerData: FlutterCreateTriggerData | undefined): Promise<boolean> {
215215
const projectName = triggerData?.sample ? "sample" : undefined;
216-
const code = await vs.commands.executeCommand("_flutter.create", projectPath, projectName, triggerData) as number;
216+
const args = { projectPath, projectName, triggerData } as FlutterCreateCommandArgs;
217+
const code = await vs.commands.executeCommand("_flutter.create", args) as number;
217218
return code === 0;
218219
}
219220

‎src/shared/constants.ts‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,7 @@ export const reactivateDevToolsAction = "Reactivate DevTools";
135135
export const vmServiceListeningBannerPattern: RegExp = new RegExp("Observatory (?:listening on|.* is available at:) (http:.+)");
136136
export const vmServiceHttpLinkPattern: RegExp = new RegExp("(http://[\\d\\.:]+/)");
137137

138-
export const runFlutterCreateDotPrompt = (platformType: string) => `You must run 'flutter create .' to create the files required to use the ${platformType} platform for this project.`;
139-
export const runFlutterCreateDotAction = "Run 'flutter create .'";
138+
export const runFlutterCreatePrompt = (platformType: string) => `Run 'flutter create --platforms ${platformType} .' to enable support for this platform?`;
140139
export const cancelAction = "Cancel";
141140

142141
export const validMethodNameRegex = new RegExp("^[a-zA-Z_][a-zA-Z0-9_]*$");

‎src/shared/interfaces.ts‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,13 @@ export interface PlatformEnabler {
137137
platformType: f.PlatformType;
138138
}
139139

140+
export interface FlutterCreateCommandArgs {
141+
projectPath?: string;
142+
projectName?: string;
143+
triggerData?: FlutterCreateTriggerData;
144+
platform?: string;
145+
}
146+
140147
export interface CustomEmulatorDefinition {
141148
id: string;
142149
name: string;

‎src/shared/vscode/device_manager.ts‎

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import * as vs from "vscode";
22
import { disposeAll, flatMap, notNullOrUndefined, uniq } from "../../shared/utils";
33
import { getAllProjectFolders } from "../../shared/vscode/utils";
4-
import { cancelAction, runFlutterCreateDotAction, runFlutterCreateDotPrompt } from "../constants";
4+
import { cancelAction, runFlutterCreatePrompt, yesAction } from "../constants";
55
import { LogCategory } from "../enums";
66
import * as f from "../flutter/daemon_interfaces";
7-
import { CustomEmulator, CustomEmulatorDefinition, Emulator, EmulatorCreator, IFlutterDaemon, Logger, PlatformEnabler } from "../interfaces";
7+
import { CustomEmulator, CustomEmulatorDefinition, Emulator, EmulatorCreator, FlutterCreateCommandArgs, IFlutterDaemon, Logger, PlatformEnabler } from "../interfaces";
88
import { logProcess } from "../logging";
99
import { safeSpawn } from "../processes";
1010
import { unique } from "../utils/array";
@@ -169,13 +169,14 @@ export class FlutterDeviceManager implements vs.Disposable {
169169
break;
170170
case "platform-enabler":
171171
const action = await vs.window.showInformationMessage(
172-
runFlutterCreateDotPrompt(selection.device.platformType),
173-
runFlutterCreateDotAction,
172+
runFlutterCreatePrompt(selection.device.platformType),
173+
yesAction,
174174
cancelAction,
175175
);
176-
if (action !== runFlutterCreateDotAction)
176+
if (action !== yesAction)
177177
return false;
178-
await vs.commands.executeCommand("_flutter.create");
178+
const createArgs = { platform: selection.device.platformType } as FlutterCreateCommandArgs;
179+
await vs.commands.executeCommand("_flutter.create", createArgs);
179180

180181
break;
181182
case "device":

‎src/test/flutter/device_manager.test.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as assert from "assert";
22
import { commands, window } from "vscode";
33
import { DaemonCapabilities } from "../../shared/capabilities/flutter";
4-
import { runFlutterCreateDotAction, runFlutterCreateDotPrompt } from "../../shared/constants";
4+
import { runFlutterCreatePrompt, yesAction } from "../../shared/constants";
55
import * as f from "../../shared/flutter/daemon_interfaces";
66
import { CustomEmulatorDefinition, IAmDisposable, IFlutterDaemon } from "../../shared/interfaces";
77
import { UnknownResponse } from "../../shared/services/interfaces";
@@ -186,8 +186,8 @@ describe("device_manager", () => {
186186
assert.equal(d.label, `Enable macos for this project`);
187187

188188
const runCreatePrompt = sb.stub(window, "showInformationMessage")
189-
.withArgs(runFlutterCreateDotPrompt(desktop.platformType), sinon.match.any)
190-
.resolves(runFlutterCreateDotAction);
189+
.withArgs(runFlutterCreatePrompt(desktop.platformType), sinon.match.any)
190+
.resolves(yesAction);
191191

192192
const flutterCreateCommand = sb.stub(commands, "executeCommand")
193193
.callThrough()

0 commit comments

Comments
 (0)