════════ 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
推理过程:
GetBuilder.initState会调用Get.find<T>(tag:xxx)Get.find返回null就会触发null!报错- 所以:你没有注册控制器实例,或
tag不匹配
这一步是结合上下文逻辑推断根因,也是最关键的一步。
第五步:验证推断(快速排查)
- 检查
Get.put()有没有写 - 如果写了,是否加了
tag - 如果
GetBuilder也写了tag,是否一致
通常你会发现:Get.put 和 GetBuilder 用的 tag 不一致,就是这次问题的根本原因。
总结:定位 Flutter 报错的通用流程
| 步骤 | 要做的事 | 说明 |
|---|---|---|
| ① | 看第一行错误描述 | 确认错误类型(null、类型错误、范围越界等) |
| ② | 找 stack trace 顶部 #0 |
找出真正抛出异常的源码位置 |
| ③ | 找 The relevant error-causing widget was: |
定位到你自己哪一行 widget 出错 |
| ④ | 结合业务逻辑推断为什么这里会出错 | 对症下药 |
| ⑤ | 回到代码验证你的推断 | 改对位置才有效 |