create static method

DevelopService create({
  1. required String projectRoot,
  2. required DisposeScope disposeScope,
  3. required Stream<List<int>> stdin,
  4. Future<void> onExit()?,
  5. void onTestsCompleted(
    1. TestCompletionResult result
    )?,
  6. void onLogEntry(
    1. Entry entry
    )?,
  7. bool verbose = false,
})

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,
  );
}