Flutter:通过日志定位问题


════════ Exception caught by widgets library ═══════════════════════════════════
The following _TypeError was thrown building KeyedSubtree-[GlobalKey#751ac]:
Null check operator used on a null value

The relevant error-causing widget was:
    Scaffold Scaffold:file:///Users/xieshaolin/workpalce/flutterTest/flutter_sophomore/lib/mainGetBuilderTag2.dart:35:12

When the exception was thrown, this was the stack:
#0      GetBuilderState.initState (package:get/get_state_manager/src/simple/get_state.dart:134:40)
get_state.dart:134
#1      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:5842:55)
framework.dart:5842
#2      ComponentElement.mount (package:flutter/src/widgets/framework.dart:5691:5)
framework.dart:5691
#3      Element.inflateWidget (package:flutter/src/widgets/framework.dart:4539:16)
framework.dart:4539
#4      MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7159:36)
framework.dart:7159
#5      MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7175:32)
framework.dart:7175
...     Normal element mounting (25 frames)
#30     Element.inflateWidget (package:flutter/src/widgets/framework.dart:4539:16)
framework.dart:4539
#31     MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7159:36)
framework.dart:7159
#32     MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7175:32)
framework.dart:7175
...     Normal element mounting (338 frames)
#370    Element.inflateWidget (package:flutter/src/widgets/framework.dart:4539:16)
framework.dart:4539
#371    MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7159:36)
framework.dart:7159
#372    MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7175:32)
framework.dart:7175
...     Normal element mounting (551 frames)
#923    Element.inflateWidget (package:flutter/src/widgets/framework.dart:4539:16)
framework.dart:4539
#924    Element.updateChild (package:flutter/src/widgets/framework.dart:4004:18)
framework.dart:4004
#925    _RawViewElement._updateChild (package:flutter/src/widgets/view.dart:481:16)
view.dart:481
#926    _RawViewElement.mount (package:flutter/src/widgets/view.dart:505:5)
view.dart:505
...     Normal element mounting (15 frames)
#941    Element.inflateWidget (package:flutter/src/widgets/framework.dart:4539:16)
framework.dart:4539
#942    Element.updateChild (package:flutter/src/widgets/framework.dart:4004:18)
framework.dart:4004
#943    RootElement._rebuild (package:flutter/src/widgets/binding.dart:1698:16)
binding.dart:1698
#944    RootElement.mount (package:flutter/src/widgets/binding.dart:1667:5)
binding.dart:1667
#945    RootWidget.attach.<anonymous closure> (package:flutter/src/widgets/binding.dart:1620:18)
binding.dart:1620
#946    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:3046:19)
framework.dart:3046
#947    RootWidget.attach (package:flutter/src/widgets/binding.dart:1619:13)
binding.dart:1619
#948    WidgetsBinding.attachToBuildOwner (package:flutter/src/widgets/binding.dart:1357:27)
binding.dart:1357
#949    WidgetsBinding.attachRootWidget (package:flutter/src/widgets/binding.dart:1342:5)
binding.dart:1342
#950    WidgetsBinding.scheduleAttachRootWidget.<anonymous closure> (package:flutter/src/widgets/binding.dart:1328:7)
binding.dart:1328
#954    _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:193:12)
isolate_patch.dart:193
(elided 3 frames from class _Timer and dart:async-patch)

════════════════════════════════════════════════════════════════════════════════

════════ Exception caught by rendering library ═════════════════════════════════
Each child must be laid out exactly once.
The relevant error-causing widget was:
    Scaffold Scaffold:file:///Users/xieshaolin/workpalce/flutterTest/flutter_sophomore/lib/mainGetBuilderTag2.dart:35:12
════════════════════════════════════════════════════════════════════════════════
I/Choreographer(20138): Skipped 2173 frames!  The application may be doing too much work on its main thread.
D/InsetsController(20138): hide(ime(), fromIme=false)
I/ImeTracker(20138): com.lin.test:3825d5f3: onCancelled at PHASE_CLIENT_ALREADY_HIDDEN

上面是一个报错的日志,我们要如何找出问题呢?

第一步:找到真正的错误信息

日志的开头是:

════════ Exception caught by widgets library ═══════════════════════════════════
The following _TypeError was thrown building KeyedSubtree-[GlobalKey#751ac]:
Null check operator used on a null value

解读:

  • Exception caught by widgets library:这个错误来自 Flutter Widgets 框架
  • Null check operator used on a null value:这是真正的 错误信息,表示 对 null 使用了 ! 导致崩溃

这一步就是:看第一行错误描述,确认错误类型

第二步:找到抛错的第一帧(最关键)

接着往下看 stack trace(堆栈):

#0      GetBuilderState.initState (package:get/get_state_manager/src/simple/get_state.dart:134:40)

解读:

  • #0 表示调用栈最顶端,也就是 真正抛出异常的代码位置
  • GetBuilderState.initState 是 的 GetBuilder 初始化逻辑
  • get_state.dart:134:40 是源码文件和行号(第134行,第40列)

这就是定位的错误源头:在 GetBuilder.initState() 里对 null 使用了 !

第三步:回溯调用链找到你自己的代码

再往下几行:

The relevant error-causing widget was:
    Scaffold Scaffold:file:///.../lib/mainGetBuilderTag2.dart:35:12

解读:

  • 这行告诉你:是你在 mainGetBuilderTag2.dart 第 35 行写的 Scaffold 对应的页面出错了
  • 也就是说:你的页面 build 时,里面的 GetBuilder 出问题了

这一步就是:找出是你写的哪一行代码触发了错误

第四步:结合错误类型推断原因

你知道:

  • Null check operator used on a null value
  • 出错在 GetBuilder.initState
  • 对应你自己写的页面 mainGetBuilderTag2.dart:35

推理过程:

  1. GetBuilder.initState 会调用 Get.find<T>(tag:xxx)
  2. Get.find 返回 null 就会触发 null! 报错
  3. 所以:你没有注册控制器实例,或 tag 不匹配

这一步是结合上下文逻辑推断根因,也是最关键的一步。

第五步:验证推断(快速排查)

  • 检查 Get.put() 有没有写
  • 如果写了,是否加了 tag
  • 如果 GetBuilder 也写了 tag,是否一致

通常你会发现:Get.putGetBuilder 用的 tag 不一致,就是这次问题的根本原因。

总结:定位 Flutter 报错的通用流程

步骤 要做的事 说明
看第一行错误描述 确认错误类型(null、类型错误、范围越界等)
找 stack trace 顶部 #0 找出真正抛出异常的源码位置
The relevant error-causing widget was: 定位到你自己哪一行 widget 出错
结合业务逻辑推断为什么这里会出错 对症下药
回到代码验证你的推断 改对位置才有效

×

喜欢就点赞,疼爱就打赏