You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

flutter_3d_controller模型已加载仍触发Flutter3DControllerLoadingException如何解决?

解决flutter_3d_controller中Flutter3DControllerLoadingException异常问题

你遇到的核心问题是控制器与3D视图未绑定,同时状态更新不规范,导致即使模型加载完成,控制器也无法正确关联到模型实例,调用方法时触发加载异常。

问题分析

  1. 你创建了Flutter3DController实例,但未将其传递给Flutter3DViewer的controller参数,控制器和3D模型视图完全脱节,无法感知模型的加载状态。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 13:35:04