diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart index dba3a05e2e..ce71686a11 100644 --- a/packages/flutter_tools/lib/src/ios/mac.dart +++ b/packages/flutter_tools/lib/src/ios/mac.dart @@ -80,54 +80,58 @@ class IMobileDevice { } class Xcode { - Xcode() { - _eulaSigned = false; - - try { - _xcodeSelectPath = runSync(['xcode-select', '--print-path'])?.trim(); - if (_xcodeSelectPath == null || _xcodeSelectPath.isEmpty) { - _isInstalled = false; - return; - } - _isInstalled = true; - - _xcodeVersionText = runSync(['xcodebuild', '-version']).replaceAll('\n', ', '); - - if (!xcodeVersionRegex.hasMatch(_xcodeVersionText)) { - _isInstalled = false; - } else { - try { - final ProcessResult result = processManager.runSync(['/usr/bin/xcrun', 'clang']); - - if (result.stdout != null && result.stdout.contains('license')) - _eulaSigned = false; - else if (result.stderr != null && result.stderr.contains('license')) - _eulaSigned = false; - else - _eulaSigned = true; - } catch (error) { - _eulaSigned = false; - } - } - } catch (error) { - _isInstalled = false; - } - } - bool get isInstalledAndMeetsVersionCheck => isInstalled && xcodeVersionSatisfactory; String _xcodeSelectPath; - String get xcodeSelectPath => _xcodeSelectPath; + String get xcodeSelectPath { + if (_xcodeSelectPath == null) { + try { + _xcodeSelectPath = runSync(['/usr/bin/xcode-select', '--print-path'])?.trim(); + } on ProcessException { + // Ignore: return null below. + } + } + return _xcodeSelectPath; + } - bool _isInstalled; - bool get isInstalled => _isInstalled; + bool get isInstalled { + if (xcodeSelectPath == null || xcodeSelectPath.isEmpty) + return false; + if (!xcodeVersionRegex.hasMatch(xcodeVersionText)) + return false; + return true; + } bool _eulaSigned; /// Has the EULA been signed? - bool get eulaSigned => _eulaSigned; + bool get eulaSigned { + if (_eulaSigned == null) { + try { + final ProcessResult result = processManager.runSync(['/usr/bin/xcrun', 'clang']); + if (result.stdout != null && result.stdout.contains('license')) + _eulaSigned = false; + else if (result.stderr != null && result.stderr.contains('license')) + _eulaSigned = false; + else + _eulaSigned = true; + } on ProcessException { + _eulaSigned = false; + } + } + return _eulaSigned; + } String _xcodeVersionText; - String get xcodeVersionText => _xcodeVersionText; + String get xcodeVersionText { + if (_xcodeVersionText != null) { + try { + _xcodeVersionText = runSync(['/usr/bin/xcodebuild', '-version']).replaceAll('\n', ', '); + } on ProcessException { + // Ignore: return null below. + } + } + return _xcodeVersionText; + } int _xcodeMajorVersion; int get xcodeMajorVersion => _xcodeMajorVersion;