flutter_3d_controller模型已加载仍触发Flutter3DControllerLoadingException如何解决?
解决flutter_3d_controller中Flutter3DControllerLoadingException异常问题
你遇到的核心问题是控制器与3D视图未绑定,同时状态更新不规范,导致即使模型加载完成,控制器也无法正确关联到模型实例,调用方法时触发加载异常。
问题分析
- 你创建了
Flutter3DController实例,但未将其传递给Flutter3DViewer的controller参数,控制器和3D模型视图完全脱节,无法感知模型的加载状态。 onLoad回调中设置_isModelLoaded = true时未调用setState,导致状态更新无法同步到逻辑层,可能出现判断条件与实际状态不符的情况。
修复方案
1. 绑定控制器与3D视图
在Flutter3DViewer组件中添加controller: _controller参数,让控制器与模型视图建立关联。
2. 规范状态更新
在onLoad回调中调用setState更新_isModelLoaded,确保状态变化被正确识别。
3. 可选:使用控制器内置加载状态
直接用_controller.isModelLoaded替代自定义的_isModelLoaded变量,更精准获取模型加载状态。
修改后的完整代码
class _ModelDisplayerState extends State<ModelDisplayer> { final Flutter3DController _controller = Flutter3DController(); bool _isModelLoaded = false; @override Widget build(BuildContext context) { return Expanded( child: Column( children: [ Flexible( flex: 4, child: InkWell( onTap: playAnimation, child: Flutter3DViewer( src: widget.skinPath, progressBarColor: Colors.blue, controller: _controller, // 绑定控制器与视图 onLoad: (_) { setState(() { _isModelLoaded = true; // 调用setState更新状态 }); }, ), ), ), Flexible( flex: 1, child: ElevatedButton.icon( onPressed: resetPosition, icon: const Icon(Icons.refresh), label: const Text('Reset'), ), ) ], ), ); } void resetPosition() { // 使用控制器内置状态判断更可靠 if (_controller.isModelLoaded) { _controller.setCameraOrbit(0, 0, 0); _controller.setCameraTarget(0, 0, 0); } } void playAnimation() { if (_controller.isModelLoaded) { _controller.playAnimation(); } } }
关键说明
- 绑定控制器后,控制器才能获取到3D模型实例,所有操作(播放动画、相机控制)才会生效。
_controller.isModelLoaded直接读取控制器内部维护的状态,避免自定义状态可能出现的不同步问题。
内容的提问来源于stack exchange,提问作者TerrorGans
相关产品推荐
相关产品推荐

