Flutter聊天图片处理插件chat_image的使用

Flutter聊天图片处理插件chat_image的使用

聊天图片插件chat_image

chat_image 是一个用于从网络加载图片、在本地存储到相册并显示本地保存图片的包。

与CachedNetworkImage的区别

CachedNetworkImage 是一个很棒的包,它可以从网络加载图片并将其存储在应用缓存中。 主要区别在于 ChatImage 下载图片后会将其存储到相册中,而不是存储在缓存中。虽然缓存不能在每次会话中重复使用,但在某些情况下可能需要重新下载图片。 然而,ChatImage 包的主要用途是存储聊天中的图片。你不会希望在重新进入聊天时再次下载图片。此包将图片在本地保存一次,并在后续使用中重复使用该图片。

安装

首先,在 pubspec.yaml 文件中添加 chat_image 作为依赖项。

iOS

在你的 Info.plist 文件中(位于 <项目根目录>/ios/Runner/Info.plist),添加以下键:

  • NSPhotoLibraryUsageDescription - 描述为什么你的应用需要访问照片库权限。这在可视化编辑器中称为隐私 - 照片库使用描述。

例如:

<key>NSPhotoLibraryUsageDescription</key>
<string>保存图片并重复使用它们</string>

Android

添加以下权限以存储图片(android.permission.WRITE_EXTERNAL_STORAGE - 使用外部存储的权限):

例如:

<manifest ...>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application
        ...
       android:requestLegacyExternalStorage="true"
       ...>
        ...
</manifest>

示例

以下是使用 ChatImage 的完整示例代码:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: FirstPage(),
    );
  }
}

const String url = "https://raw.githubusercontent.com/Babwenbiber/flutter_chat_image/master/res/TA_Logo.jpg";

class FirstPage extends StatefulWidget {
  FirstPage({Key? key}) : super(key: key);

  [@override](/user/override)
  _FirstPageState createState() => _FirstPageState();
}

class _FirstPageState extends State<FirstPage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("保存图片并显示"),
      ),
      body: Column(children: [
        ChatImage(
            url: url,
            errorBuilder: (BuildContext context, String errorMsg) {
              return Text("一些错误 $errorMsg");
            },
            imageBuilder: (BuildContext context, Image image) {
              return Container(
                color: Colors.green,
                child: Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Container(color: Colors.white, child: image),
                ),
              );
            }),
        SizedBox(
          height: 50,
        ),
        MaterialButton(
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => _SecondPage()),
              );
            },
            child: Container(
                color: Colors.blue,
                child: Padding(
                  padding: const EdgeInsets.all(20.0),
                  child: Text("在下一页重复使用图片", style: TextStyle(color: Colors.white)),
                )))
      ]),
    );
  }
}

class _SecondPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("保存图片并显示"),
      ),
      body: Column(
        children: [
          ChatImage(
              url: url,
              loadingBuilder: (BuildContext context) {
                return Center(
                  child: Container(
                    color: Colors.red,
                    height: 200,
                    width: 200,
                    child: Center(
                        child: Text(
                      "正在加载",
                      style: TextStyle(color: Colors.white, fontSize: 20),
                    )),
                  ),
                );
              },
              errorBuilder: (BuildContext context, String errorMsg) {
                return Text("一些错误 $errorMsg");
              },
              imageBuilder: (BuildContext context, Image image) {
                return Container(
                  color: Colors.green,
                  child: Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: image,
                  ),
                );
              }),
          SizedBox(
            height: 50,
          ),
          MaterialButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => FirstPage()),
                );
              },
              child: Container(
                  color: Colors.blue,
                  child: Padding(
                    padding: const EdgeInsets.all(20.0),
                    child: Text("回到第一页", style: TextStyle(color: Colors.white)),
                  )))
        ],
      ),
    );
  }
}

更多关于Flutter聊天图片处理插件chat_image的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter聊天图片处理插件chat_image的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用chat_image插件来处理聊天图片的基本示例。chat_image插件(请注意,这个插件名称可能是一个假设,因为Flutter生态系统中没有一个广泛知名的名为chat_image的官方插件)通常用于显示、上传和下载聊天中的图片。为了演示,我将假设这个插件提供了基本的图片加载和缓存功能。

首先,确保你已经在pubspec.yaml文件中添加了chat_image依赖(如果它存在的话,或者你可以替换为一个实际存在的图片处理插件,如cached_network_image):

dependencies:
  flutter:
    sdk: flutter
  chat_image: ^x.y.z  # 假设的版本号

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

接下来,在你的Flutter项目中,你可以这样使用chat_image插件来显示聊天图片:

import 'package:flutter/material.dart';
import 'package:chat_image/chat_image.dart';  // 假设的导入路径

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Chat Image Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ChatScreen(),
    );
  }
}

class ChatScreen extends StatelessWidget {
  final List<String> imageUrls = [
    'https://example.com/image1.jpg',
    'https://example.com/image2.jpg',
    // 更多图片URL...
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Chat Screen'),
      ),
      body: ListView.builder(
        itemCount: imageUrls.length,
        itemBuilder: (context, index) {
          return ChatImage(
            imageUrl: imageUrls[index],
            placeholder: AssetImage('assets/placeholder.png'),  // 本地占位符图片
            errorWidget: Icon(Icons.error),  // 加载错误时显示的组件
            fit: BoxFit.cover,  // 图片适应方式
          );
        },
      ),
    );
  }
}

// 假设的ChatImage组件(实际使用时,请参考chat_image插件的文档)
class ChatImage extends StatelessWidget {
  final String imageUrl;
  final ImageProvider placeholder;
  final Widget errorWidget;
  final BoxFit fit;

  ChatImage({
    required this.imageUrl,
    required this.placeholder,
    required this.errorWidget,
    this.fit = BoxFit.contain,
  });

  @override
  Widget build(BuildContext context) {
    // 注意:这里的ChatImageWidget是假设的,实际使用时应该使用chat_image插件提供的组件
    return ChatImageWidget.network(
      imageUrl,
      placeholder: placeholder,
      errorWidget: errorWidget,
      fit: fit,
    );
  }
}

// 注意:ChatImageWidget.network是一个假设的方法,实际使用时请参考chat_image插件的API文档

在这个示例中,ChatImage组件(这里作为一个假设的封装)用于显示网络图片。如果chat_image插件实际上存在,并且提供了类似ChatImageWidget.network的静态方法,你可以直接使用它。否则,你可能需要使用Flutter社区中广泛使用的其他图片加载库,如cached_network_image,其用法类似。

由于chat_image插件可能不存在,以下是如何使用cached_network_image插件的替代方案:

dependencies:
  flutter:
    sdk: flutter
  cached_network_image: ^x.y.z  # 使用实际的版本号

然后在你的代码中:

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

// ... (其他代码保持不变,除了ChatImage组件的实现)

class ChatImage extends StatelessWidget {
  final String imageUrl;
  final ImageProvider placeholder;
  final Widget errorWidget;
  final BoxFit fit;

  ChatImage({
    required this.imageUrl,
    required this.placeholder,
    required this.errorWidget,
    this.fit = BoxFit.contain,
  });

  @override
  Widget build(BuildContext context) {
    return CachedNetworkImage(
      imageUrl: imageUrl,
      placeholder: (context, url) => placeholder ?? CircularProgressIndicator(),
      errorWidget: (context, url, error) => errorWidget ?? Icon(Icons.error),
      fit: fit,
    );
  }
}

这个替代方案使用了cached_network_image插件来加载和缓存网络图片,同时提供了占位符和错误处理的功能。

回到顶部