UME is an in-app debug kits platform for Flutter. Produced by Flutter Infra team of ByteDance

Overview

flutter_ume

English

banner

Flutter 应用内调试工具平台

当前版本内置 10 个插件, 开发者可以创建自己的插件,并集成进 UME 平台。 详见本文为 UME 开发插件部分。

快速接入

  1. 修改 pubspec.yaml,添加依赖

    dev_dependencies: # 请不要在 release 环境下使用 UME
      flutter_ume: ^0.1.0
      flutter_ume_kit_ui: ^0.1.0
      flutter_ume_kit_device: ^0.1.0
      flutter_ume_kit_perf: ^0.1.0
      flutter_ume_kit_show_code: ^0.1.0
      flutter_ume_kit_console: ^0.1.0
  2. 执行 flutter pub get

  3. 引入包

    import 'package:flutter_ume/flutter_ume.dart'; // UME 框架
    import 'package:flutter_ume_kit_ui/flutter_ume_kit_ui.dart'; // UI 插件包
    import 'package:flutter_ume_kit_perf/flutter_ume_kit_perf.dart'; // 性能插件包
    import 'package:flutter_ume_kit_show_code/flutter_ume_kit_show_code.dart'; // 代码查看插件包
    import 'package:flutter_ume_kit_device/flutter_ume_kit_device.dart'; // 设备信息插件包
    import 'package:flutter_ume_kit_console/flutter_ume_kit_console.dart'; // debugPrint 插件包
  4. 修改程序入口,增加初始化方法及注册插件代码

    void main() {
      if (kDebugMode) {
        PluginManager.instance                                 // 注册插件
          ..register(WidgetInfoInspector())
          ..register(WidgetDetailInspector())
          ..register(ColorSucker())
          ..register(AlignRuler())
          ..register(Performance())
          ..register(ShowCode())
          ..register(MemoryInfoPage())
          ..register(CpuInfoPage())
          ..register(DeviceInfoPanel())
          ..register(Console());
        runApp(injectUMEWidget(child: MyApp(), enable: true)); // 初始化
      } else {
        runApp(MyApp());
      }
    }
  5. flutter run 运行代码 或 flutter build apk --debugflutter build ios --debug 构建产物

部分功能依赖 VM Service,本地运行需要添加额外参数,以确保能够连接到 VM Service。

Flutter 2.0.x、2.2.x 等版本在真机上运行,flutter run 需要添加 --disable-dds 参数。 在 Pull Request #80900 合入之后,--disable-dds 参数被更名为 --no-dds

特别说明

由于 UME 在顶层管理了路由栈,showDialog 等方法默认使用 rootNavigator 弹出, 所以必须showDialogshowGeneralDialog 等弹窗方法,传入参数 useRootNavigator: false 避免路由栈错误。

showDialog(
  context: context,
  builder: (ctx) => AlertDialog(
        title: const Text('Dialog'),
        actions: <Widget>[
          TextButton(
              onPressed: () => Navigator.pop(context),
              child: const Text('OK'))
        ],
      ),
  useRootNavigator: false); // <===== 非常重要

功能介绍

当前开源版 UME 内置了 10 个插件

Widget 信息
Widget 信息
Widget 详情
Widget 详情
颜色吸管
颜色吸管
对齐标尺
对齐标尺
性能浮层
性能浮层
代码查看
代码查看
日志展示
日志展示
内存信息
内存信息
CPU 信息
CPU 信息
设备信息
设备信息

为 UME 开发插件

本小节示例可参考 ./custom_plugin_example

  1. flutter create -t package custom_plugin 创建一个插件包,可以是 package,也可以是 plugin

  2. 修改插件包的 pubspec.yaml,添加依赖

    dependencies:
      flutter_ume: '>=0.1.0 <0.2.0'
  3. 创建插件配置,实现 Pluggable 虚类

    import 'package:flutter_ume/flutter_ume.dart';
    
    class CustomPlugin implements Pluggable {
      CustomPlugin({Key key});
    
      @override
      Widget buildWidget(BuildContext context) => Container(
        color: Colors.white
        width: 100,
        height: 100,
        child: Center(
          child: Text('Custom Plugin')
        ),
      ); // 返回插件面板
    
      @override
      String get name => 'CustomPlugin'; // 插件名称
    
      @override
      String get displayName => 'CustomPlugin';
    
      @override
      void onTrigger() {} // 点击插件面板图标时调用
    
      @override
      ImageProvider<Object> get iconImageProvider => NetworkImage('url'); // 插件图标
    }
  4. 在工程中引入自定义插件

    1. 修改 pubspec.yaml,添加依赖

      dev_dependencies:
        custom_plugin:
          path: path/to/custom_plugin
    2. 执行 flutter pub get

    3. 引入包

      import 'package:custom_plugin/custom_plugin.dart';
  5. 在工程中注册插件

    if (kDebugMode) {
      PluginManager.instance
        ..register(CustomPlugin());
      runApp(
        injectUMEWidget(
          child: MyApp(), 
          enable: true
        )
      );
    } else {
      runApp(MyApp());
    }
  6. 运行代码

版本说明

兼容性

UME 版本 Flutter 1.12.13 Flutter 1.22.3 Flutter 2.0.1 Flutter 2.2.1
0.1.0

单测覆盖率

master develop
flutter_ume Coverage Coverage
flutter_ume_kit_device Coverage Coverage
flutter_ume_kit_perf Coverage Coverage
flutter_ume_kit_show_code Coverage Coverage
flutter_ume_kit_ui Coverage Coverage
flutter_ume_kit_console Coverage Coverage

版本号规则

请参考 Semantic versions

更新日志

Changelog

如何贡献

Contributing

开源协议

该项目遵循 MIT 协议,详情请见 LICENSE

联系开发者

可能你:

  • 发现文档错误、代码有 bug
  • 使用 UME 后应用运行产生异常
  • 发现新版本 Flutter 无法兼容
  • 有好的点子或产品建议

上述情况均可以提一个 issue

可能你:

  • 想与开发者交流
  • 想与更多 Flutter 开发者交流
  • 想与 UME 开展交流或合作

欢迎加入字节跳动 Flutter 交流群

或随时联系开发者

Comments
  • 在flutter3.0.0 版本中, 项目报错

    在flutter3.0.0 版本中, 项目报错

    Steps to Reproduce 复现步骤

    Task :app:compileFlutterBuildDebug FAILED

    FAILURE: Build failed with an exception.

    • Where: Script 'D:\src\flutter\packages\flutter_tools\gradle\flutter.gradle' line: 1156

    • What went wrong: Execution failed for task ':app:compileFlutterBuildDebug'.

    Process 'command 'D:\src\flutter\bin\flutter.bat'' finished with non-zero exit value 1

    • Try:

    Run with --info or --debug option to get more log output. Run with --scan to get full insights.

    • Exception is: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compileFlutterBuildDebug'. at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:147) at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:145) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:133) at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77) at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56) at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:333) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:320) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:313) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:299) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:143) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:227) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:218) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:140) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) Caused by: org.gradle.process.internal.ExecException: Process 'command 'D:\src\flutter\bin\flutter.bat'' finished with non-zero exit value 1 at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:414) at org.gradle.process.internal.DefaultExecAction.execute(DefaultExecAction.java:38) at org.gradle.process.internal.DefaultExecActionFactory.exec(DefaultExecActionFactory.java:205) at org.gradle.api.internal.project.DefaultProject.exec(DefaultProject.java:1170) at org.gradle.api.internal.project.DefaultProject.exec(DefaultProject.java:1165) at org.gradle.api.Project$exec$7.call(Unknown Source) at BaseFlutterTask.buildBundle(D:\src\flutter\packages\flutter_tools\gradle\flutter.gradle:1156) at BaseFlutterTask$buildBundle.callCurrent(Unknown Source) at FlutterTask.build(D:\src\flutter\packages\flutter_tools\gradle\flutter.gradle:1281) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29) at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:242) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47) at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68) at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:227) at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:210) at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:193) at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:171) at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:89) at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:40) at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:53) at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:50) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73) at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:50) at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:40) at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68) at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38) at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48) at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:36) at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41) at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74) at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55) at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51) at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:29) at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:61) at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:42) at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:60) at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:27) at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:180) at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75) at org.gradle.internal.Either$Right.fold(Either.java:175) at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:59) at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73) at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48) at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:36) at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:25) at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36) at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22) at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:110) at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:56) at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:56) at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38) at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:73) at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:44) at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37) at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27) at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:89) at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:50) at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:114) at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:57) at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:76) at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:50) at org.gradle.internal.execution.steps.SkipEmptyWorkStep.executeWithNoEmptySources(SkipEmptyWorkStep.java:249) at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:86) at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:54) at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:32) at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:21) at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38) at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:43) at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:31) at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:40) at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:287) at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:40) at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30) at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37) at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27) at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:44) at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:33) at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:76) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:144) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:133) at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77) at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56) at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:333) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:320) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:313) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:299) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:143) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:227) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:218) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:140) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
    bug follow up 
    opened by luwei888 14
  • 关闭弹窗失效问题

    关闭弹窗失效问题

    https://github.com/bytedance/flutter_ume/issues/10#issue-958766632

    这个问题还是存在

    flutter_ume: dependency: transitive description: name: flutter_ume url: "https://pub.dartlang.org" source: hosted version: "0.2.0-dev.0" flutter_ume_kit_console: dependency: "direct dev" description: name: flutter_ume_kit_console url: "https://pub.dartlang.org" source: hosted version: "0.2.0-dev.0"

    这个是弹窗插件版本 awesome_dialog: dependency: "direct dev" description: name: awesome_dialog url: "https://pub.dartlang.org" source: hosted version: "2.1.0"

    https://user-images.githubusercontent.com/19197536/128666517-786d7032-7386-440c-b45b-3eafc98bb7ca.mp4

    opened by 18335180686 10
  • show code plugin fix

    show code plugin fix

    Describe what problem this pull request solves and how to solve it. If there is an issue associated with it, please attach a link.

    请描述这个 pull request 解决了什么问题,以及解决方式。如果有与之关联的 issue,请附链接。

    • typo fix: CodeDisplatService => CodeDisplayService
    • 修复遍历查找没有正确break
    • getIdWithClassName 这个方法没有用参数className
    • 改善测试用例

    Pull Request Checklist

    • [x] I have read the UME contribution document and understand how to contribute, commit the code according to the rules. 我已阅读过 UME 贡献文档,并了解如何进行贡献,按照规则提交了代码
    • [x] I have added the necessary comments in code to ensure that other contributors can understand the reason for the change. 我在修改中已经添加了必要的注释,以确保便于其他贡献者理解修改原因
    • [x] The code has been formatted by dartfmt before push. 代码在提交前已经经过 dartfmt 进行了格式化
    • [x] Change does not involve the adjustment of test cases. Or all existing and new tests are passing. 改动不涉及测试用例调整,或 example 工程与单元测试已经完全跑通

    If you need help, consider Join ing the ByteDance Flutter Exchange Group.

    如有任何问题,可以加入字节跳动 Flutter 交流群

    Or contact author.

    或随时联系开发者

    原来的查找方法存在的问题:

    void main(List<String> args) {
      final List<int>? list = [1, 2, 3, 4, 5];
      int? result;
      list?.forEach((element) {
        print('current: $element');
        if (element.isEven) {
          result = element;
          return;
        }
      });
      print('result: $result');
    }
    }
    

    output:

    current: 1
    current: 2
    current: 3
    current: 4
    current: 5
    result: 4
    

    原来的commit弄乱了,采用这个request

    opened by lpylpyleo 6
  • 能否移除内部的MaterialApp组件

    能否移除内部的MaterialApp组件

    如readme所说,我们不得不为弹窗额外添加一个参数,我认为这是侵入性的。

    void runAppWithTool(Widget app) {
      runApp(Directionality(
        child: MediaQuery(
          data: MediaQueryData.fromWindow(window),
          child: Localizations(
            locale: const Locale('en', 'US'),
            delegates: _localizationsDelegates.toList(),
            child: Stack(
              children: [
                app,
                UME(),
              ],
            ),
          ),
        ),
        textDirection: TextDirection.ltr,
      ));
    }
    

    例如上面的代码同样也能实现UME悬浮组件的显示,或者通过Overlay组件,至少这都不会为我们的app新增加一个路由栈。

    enhancement 
    opened by mengyanshou 6
  • 💚 Fix CI build

    💚 Fix CI build

    Make CI great again :D

    Pull Request Checklist

    • [x] I have read the UME contribution document and understand how to contribute, commit the code according to the rules. 我已阅读过 UME 贡献文档,并了解如何进行贡献,按照规则提交了代码
    • [ ] I have added the necessary comments in code to ensure that other contributors can understand the reason for the change. 我在修改中已经添加了必要的注释,以确保便于其他贡献者理解修改原因
    • [ ] The code has been formatted by dartfmt before push. 代码在提交前已经经过 dartfmt 进行了格式化
    • [x] Change does not involve the adjustment of test cases. Or all existing and new tests are passing. 改动不涉及测试用例调整,或 example 工程与单元测试已经完全跑通
    opened by AlexV525 5
  • UME 有多处依赖冲突,还未支持 Flutter 2.2.3 吗?或者计划什么时候将依赖升级到最新版?

    UME 有多处依赖冲突,还未支持 Flutter 2.2.3 吗?或者计划什么时候将依赖升级到最新版?

    What's your question 你遇到了什么问题

    依赖冲突,如:device_info,vm_service,platform....

    Environmental info 环境信息

    Flutter doctor

    Flutter 2.2.3 • channel stable • https://github.com/flutter/flutter.git
    Framework • revision f4abaa0735 (3 weeks ago) • 2021-07-01 12:46:11 -0700
    Engine • revision 241c87ad80
    Tools • Dart 2.13.4
    

    UME and kits version UME 及插件包版本

    dependencies:
      device_info: ^2.0.2
      path_provider: ^2.0.2
    dev_dependencies:
      flutter_test:
        sdk: flutter
      moor_generator: ^3.2.0
      build_runner: ^1.10.0
      vm_service: ^7.1.0
      flutter_ume: ^0.1.0
      flutter_ume_kit_ui: ^0.1.0
      flutter_ume_kit_device: ^0.1.0
      flutter_ume_kit_perf: ^0.1.0
      flutter_ume_kit_console: ^0.1.0
    
    good first issue nullsafety 
    opened by yrom 4
  • 🔥 Clean all dart code

    🔥 Clean all dart code

    Pull Request Checklist

    • [x] I have read the UME contribution document and understand how to contribute, commit the code according to the rules. 我已阅读过 UME 贡献文档,并了解如何进行贡献,按照规则提交了代码
    • [ ] I have added the necessary comments in code to ensure that other contributors can understand the reason for the change. 我在修改中已经添加了必要的注释,以确保便于其他贡献者理解修改原因
    • [ ] The code has been formatted by dartfmt before push. 代码在提交前已经经过 dartfmt 进行了格式化
    • [x] Change does not involve the adjustment of test cases. Or all existing and new tests are passing. 改动不涉及测试用例调整,或 example 工程与单元测试已经完全跑通
    opened by AlexV525 3
  • 与原生混合开发,需要Restart才能正常使用

    与原生混合开发,需要Restart才能正常使用

    与原生混合开发,需要进入flutter页面Restart才能正常使用

    通过flutter_boost混合开发,进入到flutter页面,需要restart才能正常使用
    

    Environmental info 环境信息

    Flutter doctor

    [✓] Flutter (Channel master, 2.6.0-1.0.pre.111, on macOS 11.4 20F71 darwin-x64, locale zh-Hans-CN)
    • Flutter version 2.6.0-1.0.pre.111 at /Users/admin/Desktop/xw/flutter/sdk/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 965bd1ff40 (2 weeks ago), 2021-08-29 23:41:02 -0400
    • Engine revision f4a380f3e5
    • Dart version 2.15.0 (build 2.15.0-65.0.dev)
    • Pub download mirror https://pub.flutter-io.cn
    • Flutter download mirror https://storage.flutter-io.cn
    
    
    

    UME and kits version UME 及插件包版本

    flutter_ume: ^0.2.1 flutter_ume_kit_ui: ^0.2.1 flutter_ume_kit_device: ^0.2.1
    flutter_ume_kit_perf: ^0.2.1 flutter_ume_kit_console: ^0.2.1 flutter_ume_kit_dio: ^0.2.0

    
    
    help wanted follow up 
    opened by AIYO77 3
  • Console插件不打印日志

    Console插件不打印日志

    Steps to Reproduce 复现步骤

    1. ... 接入UME
    2. ... 运行
    3. ... Console插件查看日志,空白

    Expected results 期望结果: Console插件能查看日志输出

    Actual results 实际结果: Console插件无法查看日志

    Environmental info 环境信息

    Flutter doctor

    [✓] Flutter (Channel master, 2.4.0-5.0.pre.145, on macOS 11.4 20F71 darwin-x64, locale zh-Hans-CN) [✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3) [✓] Xcode - develop for iOS and macOS [✓] Chrome - develop for the web [✓] Android Studio (version 4.1) [✓] VS Code (version 1.54.3)

    
    

    UME and kits version UME 及插件包版本

    flutter_ume: ^0.2.0-dev.0 flutter_ume_kit_ui: ^0.2.0-dev.0 # null-safety 版本: ^0.2.0-dev.0 flutter_ume_kit_device: ^0.2.0-dev.0 # null-safety 版本: ^0.2.0-dev.0 flutter_ume_kit_perf: ^0.2.0-dev.0 # null-safety 版本: ^0.2.0-dev.0 flutter_ume_kit_console: ^0.2.0-dev.0 # null-safety 版本: ^0.2.0-dev.0

    
    
    invalid 
    opened by AIYO77 3
  • DioInspector不能捕获get请求

    DioInspector不能捕获get请求

    What's your question 你遇到了什么问题

    DioInspector不能捕获get请求

    Environmental info 环境信息

    Flutter doctor

    [✓] Flutter (Channel stable, 3.3.8, on macOS 13.0.1 22A400 darwin-x64, locale zh-Hans-CN)
        • Flutter version 3.3.8 on channel stable at /Users/ying/flutter
        • Upstream repository https://github.com/flutter/flutter.git
        • Framework revision 52b3dc25f6 (3 周前), 2022-11-09 12:09:26 +0800
        • Engine revision 857bd6b74c
        • Dart version 2.18.4
        • DevTools version 2.15.0
    
    [✓] Android toolchain - develop for Android devices (Android SDK version 33.0.0)
        • Android SDK at /Users/ying/Android/sdk
        • Platform android-33, build-tools 33.0.0
        • ANDROID_HOME = /Users/ying/Android/sdk
        • Java binary at: /Applications/Android Studio.app/Contents/jre/Contents/Home/bin/java
        • Java version OpenJDK Runtime Environment (build 11.0.13+0-b1751.21-8125866)
        • All Android licenses accepted.
    
    [✓] Xcode - develop for iOS and macOS (Xcode 14.1)
        • Xcode at /Applications/Xcode.app/Contents/Developer
        • Build 14B47b
        • CocoaPods version 1.11.3
    
    [✓] Chrome - develop for the web
        • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
    
    [✓] Android Studio (version 2021.3)
        • Android Studio at /Applications/Android Studio.app/Contents
        • Flutter plugin can be installed from:
          🔨 https://plugins.jetbrains.com/plugin/9212-flutter
        • Dart plugin can be installed from:
          🔨 https://plugins.jetbrains.com/plugin/6351-dart
        • Java version OpenJDK Runtime Environment (build 11.0.13+0-b1751.21-8125866)
    
    [✓] IntelliJ IDEA Ultimate Edition (version 2022.2.4)
        • IntelliJ at /Applications/IntelliJ IDEA.app
        • Flutter plugin version 71.0.5
        • Dart plugin version 222.4459.16
    
    [✓] VS Code (version 1.73.1)
        • VS Code at /Applications/Visual Studio Code.app/Contents
        • Flutter extension can be installed from:
          🔨 https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter
    
    [✓] Connected device (4 available)
        • sdk gphone64 x86 64 (mobile) • emulator-5554                        • android-x64    • Android 12 (API 31) (emulator)
        • iPhone 8 (mobile)            • 3E9113AA-5EAE-4955-B82D-D05F3B2B2D59 • ios            • com.apple.CoreSimulator.SimRuntime.iOS-16-1
          (simulator)
        • macOS (desktop)              • macos                                • darwin-x64     • macOS 13.0.1 22A400 darwin-x64
        • Chrome (web)                 • chrome                               • web-javascript • Google Chrome 107.0.5304.121
    
    

    UME and kits version UME 及插件包版本

    dependency_overrides:
      vm_service: ^9.4.0
    
    dev_dependencies:
      flutter_ume: ^1.1.1+1
      flutter_ume_kit_console: ^1.0.0
      flutter_ume_kit_device: ^1.0.0
      flutter_ume_kit_dio: ^1.0.0
      flutter_ume_kit_perf: ^1.0.0
      flutter_ume_kit_show_code: ^1.0.0+1
      flutter_ume_kit_ui: ^1.0.0
    
    opened by kw214 2
  • 为啥 Dio 工具中展示的网络请求信息要加入 U+200b ?

    为啥 Dio 工具中展示的网络请求信息要加入 U+200b ?

    What's your question 你遇到了什么问题

    在 copy dio 请求数据的时候,发现 copy 出来的数据不能被解析,比如 json 无法直接被格式化等等。 看了下代码发现在展示网络请求信息的时候使用了 \u+200b 这个不可见字符对字符进行了拼接。

    我不太理解这个操作的意图,想问下为啥要这么做

    TextSpan(text: content.notBreak),
    ...
    extension _StringExtension on String {
      String get notBreak => Characters(this).toList().join('\u{200B}');
    }
    

    Environmental info 环境信息

    不需要

    UME and kits version UME 及插件包版本

    flutter_ume_kit_dio 1.0.0

    opened by yupengyang 2
  • flutter_ume_kit_console适配第三方日志插件logger问题

    flutter_ume_kit_console适配第三方日志插件logger问题

    使用第三方日志插件代码如下: ` import 'package:logger/logger.dart';

    // 统一日志打印配置 var logger = Logger( printer: PrettyPrinter( methodCount: 2, // number of method calls to be displayed errorMethodCount: 8, // number of method calls if stacktrace is provided lineLength: 120, // width of the output colors: true, // Colorful log messages printEmojis: true, // Print an emoji for each log message printTime: true // Should each log print contain a timestamp ), );

    `

    发现flutter_ume无法打印出日志

    opened by ClarkChu07 0
  • Flutter SDK 3.0.5编译报错

    Flutter SDK 3.0.5编译报错

    Flutter SDK 3.0.5 UME:最新版

    编译报错,flutter_logo.dart 文件, canvas.transform(Float64List.fromList,Float64List找不到

    解决方案: 1、增加导包; 或 用SDK自带的flutter logo,不用再自己copy份,本身SDK里面就有flutter_logo.dart 的

    opened by wei-spring 0
  • 和Riverpod 配合,发现无法正常使用,必须restart才能正常使用

    和Riverpod 配合,发现无法正常使用,必须restart才能正常使用

    Android 上同时集成Riverpod,无法正常使用

    Ume版本:

    flutter_ume: ^1.0.1 flutter_ume_kit_ui: ^1.0.0 flutter_ume_kit_device: ^1.0.0 flutter_ume_kit_perf: ^1.0.0 flutter_ume_kit_show_code: ^1.0.0 flutter_ume_kit_console: ^1.0.0

    riverpod版本: flutter_riverpod: 1.0.3 hooks_riverpod: 1.0.3 riverpod: 1.0.3

    PluginManager.instance // 注册插件 ..register(WidgetInfoInspector()) ..register(WidgetDetailInspector()) ..register(ColorSucker()) ..register(AlignRuler()) ..register(ColorPicker()) // 新插件 ..register(TouchIndicator()) // 新插件 ..register(Performance()) ..register(ShowCode()) ..register(MemoryInfoPage()) ..register(Console()); runApp(ProviderScope(child: UMEWidget(child: MyApp(), enable: true)));

    飞书20221103-115404

    Error log 错误日志

    没有错误日志

    
    

    Environmental info 环境信息

    Flutter doctor

    [✓] Flutter (Channel stable, 3.3.3, on Mac OS X 10.15.7 19H114 darwin-x64, locale zh-Hans-CN) Checking Android licenses is taking an unexpectedly long time...[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.0-rc2) [✗] Xcode - develop for iOS and macOS ✗ Xcode installation is incomplete; a full installation is necessary for iOS development. Download at: https://developer.apple.com/xcode/download/ Or install Xcode via the App Store. Once installed, run: sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer sudo xcodebuild -runFirstLaunch ✗ CocoaPods not installed. CocoaPods is used to retrieve the iOS and macOS platform side's plugin code that responds to your plugin usage on the Dart side. Without CocoaPods, plugins will not work on iOS or macOS. For more info, see https://flutter.dev/platform-plugins To install see https://guides.cocoapods.org/using/getting-started.html#installation for instructions. [✓] Chrome - develop for the web [✓] Android Studio (version 2021.3) [✓] IntelliJ IDEA Community Edition (version 2020.1) [✓] VS Code (version 1.72.2) [✓] Connected device (3 available)

    UME and kits version UME 及插件包版本

    flutter_ume: ^1.0.1 flutter_ume_kit_ui: ^1.0.0 flutter_ume_kit_device: ^1.0.0 flutter_ume_kit_perf: ^1.0.0 flutter_ume_kit_show_code: ^1.0.0 flutter_ume_kit_console: ^1.0.0

    opened by liuyicheng3 0
  • Update flutter_logo.dart

    Update flutter_logo.dart

    适配Flutter 3.0.5 sdk构建编译报错

    错误如下: Error: The getter 'Float64List' isn't defined for the class '_FlutterLogoPainter'.

    Fix方式,增加导包,如下: import 'dart:typed_data';

    opened by wei-spring 1
  • WIP: [feat] New plugin, SharedPreferences

    WIP: [feat] New plugin, SharedPreferences

    New plugin, SharedPreferences

    Pull Request Checklist

    • [x] I have read the UME contribution document and understand how to contribute, commit the code according to the rules. 我已阅读过 UME 贡献文档,并了解如何进行贡献,按照规则提交了代码
    • [x] I have added the necessary comments in code to ensure that other contributors can understand the reason for the change. 我在修改中已经添加了必要的注释,以确保便于其他贡献者理解修改原因
    • [x] The code has been formatted by dartfmt before push. 代码在提交前已经经过 dartfmt 进行了格式化
    • [x] Change does not involve the adjustment of test cases. Or all existing and new tests are passing. 改动不涉及测试用例调整,或 example 工程与单元测试已经完全跑通
    opened by talisk 0
Owner
Bytedance Inc.
Bytedance Inc.
Pensil Teaching App is an education platform created in flutter.

Pensil Teaching App Pensil Teach App is an education platform created specifically for the tutors of the digital age. Pensil Teaching app reduce gap b

Pensil Inc 45 Dec 1, 2022
Integrate easily the Paygate Global Platform into your Flutter app

Integrate easily the Paygate Global Platform into your Flutter app Features Implement payment with the Paygate Global Platform. Support for two paymen

Kokou AGBAVON 7 Dec 15, 2022
Get Version - Get the Version Name, Version Code, Platform and OS Version, and App ID on iOS and Android. Maintainer: @rodydavis

Get Version - Get the Version Name, Version Code, Platform and OS Version, and App ID on iOS and Android.

Flutter Community 87 Jan 4, 2023
A comprehensive, cross-platform path manipulation library for Dart.

A comprehensive, cross-platform path manipulation library for Dart. The path package provides common operations for manipulating paths: joining, split

Dart 159 Dec 29, 2022
Easy to use cross-platform regex replace command line util

replace Easy to use cross-platform regex replace command line util. Can't remember the arguments to the find command? or how xargs works? Maybe sed is

Rob Becker 3 Feb 1, 2022
Uproot(uprt) is a multi-platform (Windows, MacOs, and Linux) command line utility written in Dart to convert a router's DHCP IP Reservations between routers

UPROOT Uproot(uprt) is a multi-platform (Windows, MacOs, and Linux) command line utility written in Dart to convert a router's DHCP IP Reservations be

GeekVisit 73 Jan 1, 2023
A tool to easily install the Android SDK command-line and platform tools.

gibadb A tool to easily install the Android SDK command-line and platform tools. For developers: This README describes the CLI tool that ships with th

null 3 Sep 22, 2022
This is app includes many app.

drawer A new Flutter application. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if th

rudani jemin 6 Oct 1, 2021
Simple & Beautiful Note taking app written in dart with flutter UI toolkit.

Notes is a privacy oriented, Secure ,beautiful and fast application made in flutter, it supports various features like adding and saving notes. Hiding

null 26 Dec 30, 2022
Notes app using flutter, firebase and cloud firestore

notes A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if this is

Sidheshwar S 8 Aug 10, 2022
This recreates a ui design for a spending tracker app in Flutter.

Spending Tracker Flutter Home Screen This Flutter project recreates a minimal home screen design for a spending tracker app. The mockup was created by

Azarro 69 Oct 12, 2022
Flutter App which lets you share memes among your friends.

meme_share_app About App Flutter App which lets you share memes among your friends . Here one have 2 options : NEXT : Load Next Meme. SHARE : To Share

null 0 Oct 30, 2021
A Flutter app with test

flutter_test_login A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you start

Carlos Alito 8 Nov 1, 2021
Simple basic authentication app designed in flutter

flutter_login_signup Simple basic authentication app designed in flutter. App design is based on Login/Register Design designed by Frank Arinze Downlo

null 3 Dec 3, 2021
A flutter app with tensor flow lite image classification model to detect masks

mask_detector An app made with flutter and tensor flow lite for face mask detection. Detect mask from a photo Detect it on the live camera feed PlaySt

ANIKET SINDHU 79 Apr 11, 2022
A property search app created using flutter

flutter_property_finder A property listings app built using Flutter sdk. Tutorial Link Watch as i guide you step by step on how to build this applicat

Emmanuel Okiche 68 Dec 13, 2022
A Flutter Word generator App to improve English vocabulary

Word generator App to improve English vocabulary: Add English words you don't know and their translation, then you need to answer what is the translat

Gustavo Bonassa 1 Dec 12, 2021
A certificate generator app developed in Flutter with love.

Holden Certificate Generator made with Flutter. Dependencies spreadsheet_decoder path_provider file_picker pdf_viewer_plugin pdf permission_handler sh

null 20 Jan 4, 2023