Flutter图像占位符插件blurhash的使用

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

Flutter图像占位符插件blurhash的使用

pub package

简介

blurhash 是一个用于紧凑表示图像占位符的Flutter插件。它可以在图片加载完成之前,显示一个模糊的预览图,以提升用户体验。

平台支持

平台 支持情况
Android ✔️
iOS ✔️
Web ✔️

使用方法

要使用这个插件,请在你的 pubspec.yaml 文件中添加 blurhash 作为依赖项。

dependencies:
  flutter:
    sdk: flutter
  blurhash: ^1.0.0 # 请根据最新版本号进行调整

然后运行命令 flutter pub get 来安装依赖。

示例代码

以下是一个完整的示例项目,演示了如何在Flutter应用中使用blurhash插件。

主程序入口(main.dart)

import 'package:flutter/material.dart';
import 'package:blurhash/blurhash.dart';

void main() => runApp(const MyApp());

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DefaultTabController(
        length: 2,
        child: Scaffold(
          appBar: AppBar(
            bottom: const TabBar(
              tabs: [
                Tab(text: "Home"),
                Tab(text: "BlurHash Image"),
              ],
            ),
            title: const Text('BlurHash Example'),
          ),
          body: TabBarView(
            children: [const HomePage(), BlurHashImagePage()],
          ),
        ),
      ),
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text("Welcome to the Home Page"),
    );
  }
}

class BlurHashImagePage extends StatefulWidget {
  @override
  _BlurHashImagePageState createState() => _BlurHashImagePageState();
}

class _BlurHashImagePageState extends State<BlurHashImagePage> {
  String blurhash = "LEHV6nWB2yk8pyo0adR*.7kCMdnj";

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          SizedBox(
            width: 200,
            height: 200,
            child: BlurHash(
              hash: blurhash,
              imageFit: BoxFit.cover,
            ),
          ),
          ElevatedButton(
            onPressed: () async {
              try {
                final Uint8List? imageDataBytes = await BlurHash.decode(blurhash, 20, 12);
                if (imageDataBytes != null) {
                  // Handle decoded image data here
                  print("Decoded image successfully.");
                } else {
                  print("Failed to decode image.");
                }
              } catch (e) {
                print("Error decoding blurhash: $e");
              }
            },
            child: Text("Decode BlurHash"),
          ),
        ],
      ),
    );
  }
}

编码和解码函数

编码函数

void blurHashEncode() async {
  ByteData bytes = await rootBundle.load("assets/image.jpg"); // 确保在pubspec.yaml中配置了资源路径
  Uint8List pixels = bytes.buffer.asUint8List();
  var blurHash = await BlurHash.encode(pixels, 4, 3);
  print("Encoded BlurHash: $blurHash");
}

解码函数

void blurHashDecode(String blurhash) async {
  Uint8List? imageDataBytes;
  try {
    imageDataBytes = await BlurHash.decode(blurhash, 20, 12);
    if (imageDataBytes != null) {
      // 处理解码后的图像数据
      print("Decoded image successfully.");
    } else {
      print("Failed to decode image.");
    }
  } on PlatformException catch (e) {
    throw Exception(e.message);
  }
}

此示例展示了如何在Flutter应用中集成和使用blurhash插件,包括编码和解码功能,并提供了一个简单的UI界面来展示效果。希望这能帮助你更好地理解和使用该插件。

以上内容详细介绍了如何在Flutter项目中使用`blurhash`插件,包括其基本概念、平台支持、安装步骤以及具体的编码解码示例。希望这些信息对你有所帮助!

更多关于Flutter图像占位符插件blurhash的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter图像占位符插件blurhash的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用blurhash插件来显示图像占位符的示例代码。Blurhash 是一种高效的算法,用于在图像加载之前显示一个模糊的占位符,以改善用户体验。

首先,你需要在pubspec.yaml文件中添加blurhash依赖项:

dependencies:
  flutter:
    sdk: flutter
  blurhash: ^2.0.0  # 请检查最新版本号

然后,运行flutter pub get来安装依赖项。

接下来,在你的Flutter应用中,你可以使用Blurhash小部件来显示占位符。以下是一个完整的示例,包括从网络加载图像并显示Blurhash占位符:

import 'package:flutter/material.dart';
import 'package:blurhash/blurhash.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'dart:ui' as ui;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Blurhash Example'),
        ),
        body: Center(
          child: BlurhashImageExample(),
        ),
      ),
    );
  }
}

class BlurhashImageExample extends StatefulWidget {
  @override
  _BlurhashImageExampleState createState() => _BlurhashImageExampleState();
}

class _BlurhashImageExampleState extends State<BlurhashImageExample> {
  String? blurHash = "LDExQ2NVYm9m#xyZYx9kK_kGZMx8k8xU6Q"; // 示例Blurhash字符串
  late final DefaultCacheManager cacheManager;

  @override
  void initState() {
    super.initState();
    cacheManager = DefaultCacheManager();
    loadImage();
  }

  void loadImage() async {
    final imageUrl = "https://example.com/path/to/your/image.jpg"; // 替换为你的图片URL
    final file = await cacheManager.getSingleFile(imageUrl);
    final imageProvider = FileImage(file.file);

    // 这里假设你有一个方法来获取Blurhash字符串,这里直接硬编码了一个示例
    // 在实际应用中,你可能需要在图片上传时生成Blurhash字符串,并存储在服务器中
    // 然后在加载图片时一起获取Blurhash字符串

    // 使用postFrameCallback来确保Blurhash在图像加载前显示
    WidgetsBinding.instance?.addPostFrameCallback((_) async {
      setState(() {
        // 可以在这里设置blurHash字符串,如果它是从服务器获取的
      });
    });

    // 显示实际图像
    imageProvider.load(ui.createImageContext())
        .then((imageInfo) => {
          if (mounted) {
            setState(() {}); // 触发UI更新
          }
        })
        .catchError((error) {
          print("Error loading image: $error");
        });
  }

  @override
  Widget build(BuildContext context) {
    return Stack(
      alignment: Alignment.center,
      children: [
        if (blurHash != null)
          Blurhash(
            hash: blurHash!,
            width: 300,
            height: 300,
            child: Container(color: Colors.grey.withOpacity(0.2)), // 可选的背景色
          ),
        CachedNetworkImage(
          imageUrl: "https://example.com/path/to/your/image.jpg", // 替换为你的图片URL
          placeholder: (context, url) => CircularProgressIndicator(),
          errorWidget: (context, url, error) => Icon(Icons.error),
          width: 300,
          height: 300,
          fit: BoxFit.cover,
        ),
      ],
    );
  }
}

在这个示例中:

  1. Blurhash小部件用于显示Blurhash占位符。
  2. CachedNetworkImage小部件用于从网络加载并显示实际图像。这里使用了flutter_cache_manager库来缓存图像,以避免重复加载。
  3. blurHash字符串是一个示例Blurhash值,实际应用中你可能需要从服务器获取这个值。

请注意,你需要确保在图像上传时生成Blurhash字符串,并在图像加载时从服务器获取它。这个示例中为了简化直接硬编码了一个Blurhash字符串。

回到顶部