Flutter网络图片运行检测插件run_with_network_images的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter网络图片运行检测插件run_with_network_images的使用

当您测试包含 Image.network 的应用时,您可能会遇到 400 响应。这是因为 Image.network 使用了 dart:io 中的 HttpClient,而在 Flutter 小部件测试中,HttpClient 总是返回 400 响应。

要解决此问题,您可以覆盖 HttpClient 以返回模拟图像而不是 400 响应。该插件正是为了帮助您实现这一点。

安装

您可以通过执行以下命令来安装该插件:

flutter pub add --dev run_with_network_images

或者,打开 pubspec.yaml 文件,并将 run_with_network_images 包添加到 dev_dependencies 中,如下所示:

...
dev_dependencies:
  run_with_network_images: [version]
...

示例

您可以使用 runWithNetworkImages 函数来修复 Image.network400 响应问题。完整的测试示例如下:

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:run_with_network_images/src/run_with_network_images.dart';

void main() {
  testWidgets('网络图片在小部件测试中被渲染', (
    WidgetTester tester,
  ) async {
    await runWithNetworkImages(() async {
      await tester.pumpWidget(
        MaterialApp(
          home: Image.network(
            'https://dev-yakuza.posstree.com/assets/images/yakuza.jpg',
          ),
        ),
      );

      final image = tester.widget<Image>(find.byType(Image));
      expect(
        (image.image as NetworkImage).url,
        'https://dev-yakuza.posstree.com/assets/images/yakuza.jpg',
      );
    });
  });
}

您只需将测试代码包裹在 await runWithNetworkImages(() async {}); 中即可修复该问题。

贡献

如果您想为该包做出贡献,请参阅 CONTRIBUTING.md


示例代码

以下是完整的示例代码:

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:run_with_network_images/run_with_network_images.dart';

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Image.network(
        'https://dev-yakuza.posstree.com/assets/images/yakuza.jpg',
      ),
    );
  }
}

void main() {
  testWidgets('网络图片在小部件测试中被渲染', (
    WidgetTester tester,
  ) async {
    await runWithNetworkImages(() async {
      await tester.pumpWidget(const MyApp());

      final image = tester.widget<Image>(find.byType(Image));
      expect(
        (image.image as NetworkImage).url,
        'https://dev-yakuza.posstree.com/assets/images/yakuza.jpg',
      );
    });
  });
}

更多关于Flutter网络图片运行检测插件run_with_network_images的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络图片运行检测插件run_with_network_images的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用run_with_network_images插件来检测网络图片加载情况的示例代码。请注意,run_with_network_images并非一个广泛知名的官方或社区插件,因此我将假设你指的是一个自定义的或类似功能的插件,其核心目的是在开发过程中帮助检测网络图片的加载状态。

在实际场景中,通常我们会使用Flutter自带的网络图片加载功能,并结合一些状态管理来检测图片的加载状态。不过,为了贴合你的需求,我将展示一个假设的插件使用方式,并给出一个基于Flutter内置功能的替代方案。

假设的run_with_network_images插件使用方式

由于run_with_network_images不是标准插件,这里给出一个假设的API使用方式。假设该插件提供了一个NetworkImageWrapper组件,用于包装Image.network并提供加载状态回调。

import 'package:flutter/material.dart';
import 'package:run_with_network_images/run_with_network_images.dart'; // 假设的包路径

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Network Image Loader with Status Detection'),
        ),
        body: Center(
          child: NetworkImageWrapper(
            imageUrl: 'https://example.com/image.jpg',
            onLoadSuccess: () {
              print('Image loaded successfully');
            },
            onLoadError: (error) {
              print('Failed to load image: $error');
            },
            child: Image.network(
              'https://example.com/image.jpg',
              fit: BoxFit.cover,
            ),
          ),
        ),
      ),
    );
  }
}

使用Flutter内置功能实现网络图片加载状态检测

实际上,Flutter没有直接提供这样的插件,但你可以通过ImageProvider和状态管理来实现类似的功能。以下是一个使用Image.networkStatefulWidget来检测图片加载状态的示例:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Network Image Loader with Status Detection'),
        ),
        body: Center(
          child: NetworkImageChecker(
            imageUrl: 'https://example.com/image.jpg',
          ),
        ),
      ),
    );
  }
}

class NetworkImageChecker extends StatefulWidget {
  final String imageUrl;

  NetworkImageChecker({required this.imageUrl});

  @override
  _NetworkImageCheckerState createState() => _NetworkImageCheckerState();
}

class _NetworkImageCheckerState extends State<NetworkImageChecker> {
  bool isLoading = true;
  Object? error;

  @override
  Widget build(BuildContext context) {
    if (isLoading) {
      return CircularProgressIndicator();
    } else if (error != null) {
      return Text('Failed to load image: $error');
    } else {
      return Image.network(
        widget.imageUrl,
        fit: BoxFit.cover,
        loadingBuilder: (BuildContext context, Widget child, ImageChunkEvent? loadingProgress) {
          if (loadingProgress == null) return child;
          return Stack(
            alignment: Alignment.center,
            children: <Widget>[
              child,
              CircularProgressIndicator(
                value: loadingProgress.expectedTotalBytes != null
                    ? loadingProgress.cumulativeBytesLoaded!.toDouble() / loadingProgress.expectedTotalBytes!.toDouble()
                    : null,
              ),
            ],
          );
        },
        errorWidget: (context, error, stackTrace) {
          setState(() {
            this.error = error;
            isLoading = false;
          });
          return Text('Failed to load image: $error');
        },
      );
    }
  }
}

在这个例子中,NetworkImageChecker组件使用了Image.networkloadingBuildererrorWidget参数来分别处理加载中和加载失败的情况。同时,通过内部状态管理来更新UI。

希望这个示例能够满足你的需求,并为你提供一个关于如何在Flutter中检测网络图片加载状态的参考。

回到顶部