修复 断点异常
This commit is contained in:
229
flutter-runner/extension.js
Normal file
229
flutter-runner/extension.js
Normal file
@@ -0,0 +1,229 @@
|
||||
const vscode = require('vscode');
|
||||
|
||||
let flutterTerminal = null;
|
||||
|
||||
function getTerminal() {
|
||||
if (!flutterTerminal || flutterTerminal.exitStatus !== undefined) {
|
||||
flutterTerminal = vscode.window.createTerminal('Flutter');
|
||||
}
|
||||
return flutterTerminal;
|
||||
}
|
||||
|
||||
function runCommand(cmd) {
|
||||
const terminal = getTerminal();
|
||||
terminal.show();
|
||||
terminal.sendText(cmd);
|
||||
}
|
||||
|
||||
async function selectBuildPlatform() {
|
||||
const platforms = [
|
||||
{ label: '$(device-mobile) APK (Android)', value: 'apk' },
|
||||
{ label: '$(apple) IPA (iOS)', value: 'ios' },
|
||||
{ label: '$(globe) Web', value: 'web' },
|
||||
{ label: '$(window) Windows', value: 'windows' },
|
||||
{ label: '$(vm) macOS', value: 'macos' },
|
||||
{ label: '$(terminal) Linux', value: 'linux' }
|
||||
];
|
||||
const selected = await vscode.window.showQuickPick(platforms, {
|
||||
placeHolder: '选择构建平台'
|
||||
});
|
||||
return selected ? selected.value : null;
|
||||
}
|
||||
|
||||
async function selectDevice() {
|
||||
const terminal = getTerminal();
|
||||
terminal.show();
|
||||
terminal.sendText('flutter devices');
|
||||
vscode.window.showInformationMessage('请在终端查看可用设备,然后输入设备ID');
|
||||
const deviceId = await vscode.window.showInputBox({
|
||||
placeHolder: '输入设备ID(留空使用默认设备)',
|
||||
title: '选择运行设备'
|
||||
});
|
||||
return deviceId || null;
|
||||
}
|
||||
|
||||
async function startDebugRun(deviceId) {
|
||||
const workspaceFolders = vscode.workspace.workspaceFolders;
|
||||
if (!workspaceFolders || workspaceFolders.length === 0) {
|
||||
vscode.window.showErrorMessage('请先打开一个 Flutter 项目');
|
||||
return;
|
||||
}
|
||||
const folder = workspaceFolders[0];
|
||||
const debugConfig = {
|
||||
type: 'dart',
|
||||
name: 'Flutter (Debug)',
|
||||
request: 'launch',
|
||||
program: 'lib/main.dart',
|
||||
flutterMode: 'debug'
|
||||
};
|
||||
if (deviceId) {
|
||||
debugConfig.deviceId = deviceId;
|
||||
}
|
||||
const started = await vscode.debug.startDebugging(folder, debugConfig);
|
||||
if (!started) {
|
||||
vscode.window.showErrorMessage('启动调试失败,请确保已安装 Dart 扩展');
|
||||
}
|
||||
}
|
||||
|
||||
async function startProfileRun() {
|
||||
const workspaceFolders = vscode.workspace.workspaceFolders;
|
||||
if (!workspaceFolders || workspaceFolders.length === 0) {
|
||||
vscode.window.showErrorMessage('请先打开一个 Flutter 项目');
|
||||
return;
|
||||
}
|
||||
const folder = workspaceFolders[0];
|
||||
const debugConfig = {
|
||||
type: 'dart',
|
||||
name: 'Flutter (Profile)',
|
||||
request: 'launch',
|
||||
program: 'lib/main.dart',
|
||||
flutterMode: 'profile'
|
||||
};
|
||||
const started = await vscode.debug.startDebugging(folder, debugConfig);
|
||||
if (!started) {
|
||||
vscode.window.showErrorMessage('启动 Profile 模式失败');
|
||||
}
|
||||
}
|
||||
|
||||
function activate(context) {
|
||||
const provider = new FlutterRunnerProvider();
|
||||
context.subscriptions.push(
|
||||
vscode.window.registerTreeDataProvider('flutterRunner', provider)
|
||||
);
|
||||
|
||||
context.subscriptions.push(
|
||||
vscode.commands.registerCommand('flutterRunner.run', async () => {
|
||||
const deviceId = await selectDevice();
|
||||
await startDebugRun(deviceId);
|
||||
})
|
||||
);
|
||||
|
||||
context.subscriptions.push(
|
||||
vscode.commands.registerCommand('flutterRunner.runDebug', async () => {
|
||||
await startDebugRun();
|
||||
})
|
||||
);
|
||||
|
||||
context.subscriptions.push(
|
||||
vscode.commands.registerCommand('flutterRunner.runProfile', async () => {
|
||||
await startProfileRun();
|
||||
})
|
||||
);
|
||||
|
||||
context.subscriptions.push(
|
||||
vscode.commands.registerCommand('flutterRunner.hotReload', () => {
|
||||
vscode.commands.executeCommand('flutter.hotReload');
|
||||
})
|
||||
);
|
||||
|
||||
context.subscriptions.push(
|
||||
vscode.commands.registerCommand('flutterRunner.hotRestart', () => {
|
||||
vscode.commands.executeCommand('flutter.hotRestart');
|
||||
})
|
||||
);
|
||||
|
||||
context.subscriptions.push(
|
||||
vscode.commands.registerCommand('flutterRunner.stopDebug', () => {
|
||||
if (vscode.debug.activeDebugSession) {
|
||||
vscode.debug.stopDebugging();
|
||||
} else {
|
||||
vscode.window.showInformationMessage('没有正在运行的调试会话');
|
||||
}
|
||||
})
|
||||
);
|
||||
|
||||
context.subscriptions.push(
|
||||
vscode.commands.registerCommand('flutterRunner.clean', () => {
|
||||
runCommand('flutter clean');
|
||||
})
|
||||
);
|
||||
|
||||
context.subscriptions.push(
|
||||
vscode.commands.registerCommand('flutterRunner.pubGet', () => {
|
||||
runCommand('flutter pub get');
|
||||
})
|
||||
);
|
||||
|
||||
context.subscriptions.push(
|
||||
vscode.commands.registerCommand('flutterRunner.build', async () => {
|
||||
const platform = await selectBuildPlatform();
|
||||
if (platform) {
|
||||
runCommand(`flutter build ${platform}`);
|
||||
}
|
||||
})
|
||||
);
|
||||
|
||||
context.subscriptions.push(
|
||||
vscode.commands.registerCommand('flutterRunner.refresh', () => {
|
||||
provider.refresh();
|
||||
})
|
||||
);
|
||||
|
||||
vscode.debug.onDidChangeActiveDebugSession((session) => {
|
||||
provider.refresh();
|
||||
});
|
||||
}
|
||||
|
||||
class FlutterRunnerProvider {
|
||||
constructor() {
|
||||
this._onDidChangeTreeData = new vscode.EventEmitter();
|
||||
this.onDidChangeTreeData = this._onDidChangeTreeData.event;
|
||||
}
|
||||
|
||||
refresh() {
|
||||
this._onDidChangeTreeData.fire();
|
||||
}
|
||||
|
||||
getTreeItem(element) {
|
||||
return element;
|
||||
}
|
||||
|
||||
getChildren(element) {
|
||||
if (!element) {
|
||||
const isDebugging = !!vscode.debug.activeDebugSession;
|
||||
const items = [
|
||||
this.createButtonItem('▶️ Run (Debug)', 'flutterRunner.runDebug', '调试模式运行(支持热重载、断点、调试控制台)'),
|
||||
this.createButtonItem('📱 Run (选择设备)', 'flutterRunner.run', '选择设备后调试运行'),
|
||||
this.createButtonItem('📊 Run (Profile)', 'flutterRunner.runProfile', 'Profile 模式运行(性能分析)'),
|
||||
this.createSectionItem('── 调试控制 ──'),
|
||||
this.createButtonItem('🔥 Hot Reload', 'flutterRunner.hotReload', '热重载(保持状态)'),
|
||||
this.createButtonItem('🔄 Hot Restart', 'flutterRunner.hotRestart', '热重启(重置状态)'),
|
||||
this.createButtonItem('⏹️ Stop', 'flutterRunner.stopDebug', '停止调试会话'),
|
||||
this.createSectionItem('── 项目命令 ──'),
|
||||
this.createButtonItem('🧹 Clean', 'flutterRunner.clean', '清理构建缓存'),
|
||||
this.createButtonItem('📦 Pub Get', 'flutterRunner.pubGet', '获取依赖'),
|
||||
this.createButtonItem('🔨 Build', 'flutterRunner.build', '构建发布包')
|
||||
];
|
||||
if (isDebugging) {
|
||||
items.unshift(this.createStatusItem('🟢 调试运行中'));
|
||||
} else {
|
||||
items.unshift(this.createStatusItem('⚪ 未运行'));
|
||||
}
|
||||
return items;
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
createButtonItem(label, command, tooltip) {
|
||||
const item = new vscode.TreeItem(label, vscode.TreeItemCollapsibleState.None);
|
||||
item.command = { command, title: label };
|
||||
item.tooltip = tooltip;
|
||||
return item;
|
||||
}
|
||||
|
||||
createSectionItem(label) {
|
||||
const item = new vscode.TreeItem(label, vscode.TreeItemCollapsibleState.None);
|
||||
item.tooltip = label;
|
||||
return item;
|
||||
}
|
||||
|
||||
createStatusItem(label) {
|
||||
const item = new vscode.TreeItem(label, vscode.TreeItemCollapsibleState.None);
|
||||
item.tooltip = label;
|
||||
return item;
|
||||
}
|
||||
}
|
||||
|
||||
function deactivate() {}
|
||||
|
||||
module.exports = { activate, deactivate };
|
||||
Reference in New Issue
Block a user