runWithConsole function

void runWithConsole(
  1. Widget app, {
  2. Future beforeRun()?,
  3. double designWidth = 375,
  4. double scalingBreakpoint = kRunWithConsoleDefaultScalingBreakpoint,
  5. int logTruncateLength = 2000,
  6. bool enableScaling = kRunWithConsoleDefaultEnableScaling,
  7. JunnyISpectLogConfig? ispectLogConfig,
})

运行应用,并使用 Inspector。

  • app 应用
  • beforeRun 运行前回调
  • designWidth 设计图宽度
  • scalingBreakpoint 启用按设计稿缩放的最大逻辑宽度
  • logTruncateLength 控制 Inspector 日志截断长度
  • enableScaling 是否启用 scaled_app 缩放
  • ispectLogConfig 可选 ISpect 日志配置;未传时不读取 JunnyKitConfig

Implementation

void runWithConsole(
  Widget app, {
  Future<dynamic> Function()? beforeRun,
  double designWidth = 375,
  double scalingBreakpoint = kRunWithConsoleDefaultScalingBreakpoint,
  int logTruncateLength = 2000,
  bool enableScaling = kRunWithConsoleDefaultEnableScaling,
  JunnyISpectLogConfig? ispectLogConfig,
}) {
  final JunnyISpectRuntimeController logRuntimeController =
      JunnyISpectRuntimeController.instance;
  final ISpectLogger iSpectLogger = ISpectFlutter.init(
    options: buildRunWithConsoleISpectLoggerOptions(
      ispectLogConfig: ispectLogConfig,
      logTruncateLength: logTruncateLength,
    ),
  );
  logRuntimeController.bindLogger(iSpectLogger);
  // 先落地到运行期配置,后续 binding 初始化和根 MediaQuery 修正都从这里取值。
  JunnyScalingConfig.configure(
    enableScaling: enableScaling,
    designWidth: designWidth,
    scalingBreakpoint: scalingBreakpoint,
  );

  ISpect.run(
    () async {
      // 初始化缩放
      if (JunnyScalingConfig.enableScaling) {
        // scaled_app 必须在 runApp 前接管 Flutter binding(绑定层),否则首帧布局拿不到缩放规则。
        ScaledWidgetsFlutterBinding.ensureInitialized(
          scaleFactor: (Size deviceSize) {
            // scaleFactor 会在 binding(绑定层)被多次读取,所以不能捕获入参快照;
            // 统一从运行期配置取值,保证调用方覆盖配置后各入口使用同一套规则。
            return resolveScalingFactor(
              deviceSize: deviceSize,
              designWidth: JunnyScalingConfig.designWidth,
              scalingBreakpoint: JunnyScalingConfig.scalingBreakpoint,
            );
          },
        );
      } else {
        WidgetsFlutterBinding.ensureInitialized();
      }

      // 由于是异步, 所以不能放在onInit中
      if (beforeRun != null) {
        await beforeRun.call();
      }

      runApp(app);
    },
    logger: iSpectLogger,
    onFlutterError: (FlutterErrorDetails details, StackTrace? stackTrace) {
      _dealWithError(
        details.exception,
        stackTrace ?? details.stack ?? StackTrace.current,
      );
    },
    onZonedError: (Object error, StackTrace stackTrace) {
      _dealWithError(error, stackTrace);
    },
    onPlatformDispatcherError: (Object error, StackTrace stackTrace) {
      _dealWithError(error, stackTrace);
    },
  );
}