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

Flutter报错ArgumentError:URI无指定host,图片无法显示求助

解决Flutter GetX控制器实例不共享导致图片加载失败的问题

问题根源

你遇到的ArgumentError (Invalid argument(s): No host specified in URI file:///)本质是控制器实例不共享:

  • ListView里赋值的是某个PaginationController实例的ProductImage,但ProductDetailsPage里重新创建了一个全新的控制器实例,这个新实例的ProductImage初始值为空字符串,导致Image.network拿到空URL抛出错误。
  • 全局变量ImageURL仅在initState里赋值一次,后续控制器变量更新时无法触发UI刷新,因为没有监听Rx变量的变化。

修复步骤及代码

1. 共享控制器实例,移除页面内的新实例

不要在ProductDetailsPage里重新创建PaginationController,改用GetX的Get.find()获取全局唯一实例(前提是你已在应用初始化时用Get.put(PaginationController())注册过控制器,比如在main.dart中)。

2. 用Obx实现响应式UI刷新

去掉全局的ImageURL变量,用Obx包裹Image组件,自动监听RxString的变化并更新UI,同时增加空值判断避免报错。

修改后的ProductDetailsPage代码:

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:keycehennemi/controllers/PaginationController.dart';

class ProductDetailsPage extends StatelessWidget {
  // 获取全局已注册的控制器实例
  final PaginationController paginationController = Get.find<PaginationController>();

  const ProductDetailsPage({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
        child: Column(
          children: [
            Obx(() {
              // 空URL时显示占位内容,避免报错
              if (paginationController.ProductImage.value.isEmpty) {
                return const Center(child: Text("图片加载中..."));
              }
              return Image.network(
                paginationController.ProductImage.value,
                fit: BoxFit.cover,
                // 可选:添加加载错误占位
                errorBuilder: (context, error, stackTrace) {
                  return const Icon(Icons.broken_image);
                },
              );
            }),
          ],
        ),
      ),
    );
  }
}

3. 优化ListView里的赋值逻辑

Rx变量赋值不需要调用setState,直接修改value即可:

onTap: () {
  paginationController.ProductImage.value = snapshot.data.docs[index].data()["Image"];
  Get.to(const ProductDetailsPage());
},

4. (可选)规范变量命名

遵循Dart小驼峰命名规范,把控制器里的ProductImage改成productImage,代码更易读:

class PaginationController extends GetxController {
  RxString productImage = RxString("");
}

额外注意

确保在应用启动时注册控制器,比如在main.dart里:

void main() {
  Get.put(PaginationController());
  runApp(const MyApp());
}

内容的提问来源于stack exchange,提问作者Emir Bolat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:48:30