late修饰的targetSquare调用isMounted仍触发LateInitializationError求助
问题原因与解决方法
报错原因
你用late修饰的targetSquare变量,在未完成初始化前,任何对它的访问(包括读取属性、调用方法)都会直接抛出LateInitializationError。你写的targetSquare.isMounted本质是先访问targetSquare变量本身,再读取它的isMounted属性,所以哪怕是判断属性也会触发错误。
解决方法
方法1:改用可空类型替代late
将变量声明改为可空类型,先判断变量是否不为null,再访问其属性:
SquareComponent? targetSquare; @override Future<void> update(double dt) async { // 先把变量赋值给局部变量,避免多次空判断 final target = targetSquare; if (target != null && target.isMounted) { if (!target.resourceIsFinished) { targetGridPosition = currentGridPosition; } else { currentGridPosition = targetGridPosition; } } }
或者用空安全语法糖简化:
@override Future<void> update(double dt) async { final target = targetSquare; if (target?.isMounted ?? false) { if (!target!.resourceIsFinished) { targetGridPosition = currentGridPosition; } else { currentGridPosition = targetGridPosition; } } }
方法2:确保targetSquare在update执行前完成初始化
如果业务逻辑要求targetSquare必须存在才能执行后续逻辑,那就要保证它在update第一次调用前完成初始化,比如在组件的onMount方法中赋值:
late SquareComponent targetSquare; @override void onMount() { super.onMount(); // 在这里完成targetSquare的初始化 targetSquare = SquareComponent(/* 初始化参数 */); } @override Future<void> update(double dt) async { if (targetSquare.isMounted) { if (!targetSquare.resourceIsFinished) { targetGridPosition = currentGridPosition; } else { currentGridPosition = targetGridPosition; } } }
方法3:直接在声明时初始化late变量
如果targetSquare的初始化逻辑可以提前确定,也可以直接在声明时完成初始化:
late SquareComponent targetSquare = SquareComponent(/* 初始化参数 */);
内容的提问来源于stack exchange,提问作者matti peterbull
相关产品推荐
相关产品推荐

