create static method
Creates all required CLI components and returns a DevelopService.
projectRoot is the path to the Flutter project directory.
disposeScope manages the lifecycle of spawned processes.
stdin is the stream that FlutterTool reads for interactive commands
(hot restart, quit, etc.).
onExit replaces the default exit(0) in FlutterTool -- useful for
keeping the host process alive (e.g. in an MCP server).
onTestsCompleted is forwarded to DevelopService for test completion
notifications.
onLogEntry is called for every parsed log entry during the session.
verbose enables verbose logging when true.
Implementation
static DevelopService create({
required String projectRoot,
required DisposeScope disposeScope,
required Stream<List<int>> stdin,
Future<void> Function()? onExit,
void Function(TestCompletionResult result)? onTestsCompleted,
void Function(Entry entry)? onLogEntry,
bool verbose = false,
}) {
const fs = LocalFileSystem();
const platform = LocalPlatform();
const processManager = LocalProcessManager();
final rootDirectory = fs.directory(projectRoot);
final logger = Logger(level: verbose ? Level.verbose : Level.info);
final flutterTool = FlutterTool(
stdin: stdin,
processManager: processManager,
platform: platform,
parentDisposeScope: disposeScope,
logger: logger,
onExit: onExit,
);
return DevelopService(
deviceFinder: DeviceFinder(
processManager: processManager,
parentDisposeScope: disposeScope,
logger: logger,
),
testFinderFactory: TestFinderFactory(rootDirectory: rootDirectory),
testBundler: TestBundler(projectRoot: rootDirectory, logger: logger),
dartDefinesReader: DartDefinesReader(projectRoot: rootDirectory),
compatibilityChecker: CompatibilityChecker(
projectRoot: rootDirectory,
processManager: processManager,
logger: logger,
),
pubspecReader: PubspecReader(projectRoot: rootDirectory),
androidTestBackend: AndroidTestBackend(
adb: Adb(),
processManager: processManager,
platform: platform,
rootDirectory: rootDirectory,
parentDisposeScope: disposeScope,
logger: logger,
),
iosTestBackend: IOSTestBackend(
processManager: processManager,
platform: platform,
fs: fs,
rootDirectory: rootDirectory,
parentDisposeScope: disposeScope,
logger: logger,
),
macosTestBackend: MacOSTestBackend(
processManager: processManager,
platform: platform,
fs: fs,
rootDirectory: rootDirectory,
parentDisposeScope: disposeScope,
logger: logger,
),
webTestBackend: WebTestBackend(
processManager: processManager,
parentDisposeScope: disposeScope,
logger: logger,
),
flutterTool: flutterTool,
logger: logger,
stdin: stdin,
onTestsCompleted: onTestsCompleted,
onLogEntry: onLogEntry,
);
}