使用Flutter实现一个用户头像组件,size为宽高值,头像是src地址,圆角是6px,注意src地址是网络地址

在 Flutter 中实现一个自定义头像组件,可以接收 sizesrc(网络地址)和圆角大小作为参数,你可以创建一个新的 StatefulWidget 或 StatelessWidget。下面是一个 StatelessWidget 的示例:

dart 复制代码
import 'package:flutter/material.dart';

class Avatar extends StatelessWidget {
  final double size;
  final String src;
  final double borderRadius;

  const Avatar({
    Key? key,
    required this.size,
    required this.src,
    this.borderRadius = 6.0,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ClipRRect(
      borderRadius: BorderRadius.circular(borderRadius),
      child: Image.network(
        src,
        width: size,
        height: size,
        fit: BoxFit.cover,
        errorBuilder:
            (BuildContext context, Object exception, StackTrace? stackTrace) {
          // If the image fails to load, you can display a placeholder or an error widget
          return Container(
            color: Colors.grey[300],
            width: size,
            height: size,
            child: Icon(Icons.person, size: size / 2),
          );
        },
      ),
    );
  }
}

使用该组件的示例:

dart 复制代码
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Custom Avatar Component',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Custom Avatar Component'),
        ),
        body: Center(
          child: Avatar(
            size: 100.0,
            src: 'https://example.com/user_avatar.png', // 替换为你的图片网络地址
            borderRadius: 6.0,
          ),
        ),
      ),
    );
  }
}

这个 Avatar 组件接收三个参数:size 确定头像的宽度和高度,src 是头像图片的网络地址,borderRadius 确定头像的圆角大小。如果图片加载失败,使用了 errorBuilder 函数来提供一个备用的 placeholder 方案。

确保替换 'https://example.com/user_avatar.png' 为你实际的网络图片地址。如果网络地址无效或者因为任何原因导致图片加载失败,errorBuilder会提供一个灰色背景的容器,其中包含一个人形图标,表示用户头像。

在实际的Flutter应用中,你可能还需要考虑图片的缓存策略以及加载时的占位符显示。为了改进上面的示例,我们可以使用CachedNetworkImage包代替Image.network来进行图片的缓存,并在图片加载的过程中显示一个圆形的进度指示器。下面是改进后的代码示例:

首先,你需要在pubspec.yaml文件中添加cached_network_image包的依赖:

Yaml 复制代码
dependencies:
  flutter:
    sdk: flutter
  cached_network_image: ^3.0.0 # 请检查并使用最新版本

安装依赖后,在 Dart 代码中使用这个包:

Dart 复制代码
import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';

class Avatar extends StatelessWidget {
  final double size;
  final String src;
  final double borderRadius;

  const Avatar({
    Key? key,
    required this.size,
    required this.src,
    this.borderRadius = 6.0,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ClipRRect(
      borderRadius: BorderRadius.circular(borderRadius),
      child: CachedNetworkImage(
        imageUrl: src,
        width: size,
        height: size,
        fit: BoxFit.cover,
        placeholder: (context, url) => CircularProgressIndicator(), // 加载时显示进度圈
        errorWidget: (context, url, error) => Container(
          color: Colors.grey[300],
          width: size,
          height: size,
          child: Icon(Icons.person, size: size / 2),
        ),
      ),
    );
  }
}

在这个改进的版本中,CachedNetworkImage组件会处理图片的加载及缓存,并提供了图片加载过程中的placeholder和加载失败时的errorWidgetCircularProgressIndicator会在图片加载过程中展示一个圆形的加载动画,而当加载失败时,将同样显示一个带有用户图标的容器作为错误提示。这里的 CircularProgressIndicator 是内置的进度指示器,其大小和颜色可以根据需要进行调整。

完整代码示例可以像这样使用:

Dart 复制代码
import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Custom Avatar Component',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Custom Avatar Component'),
        ),
        body: Center(
          child: Avatar(
            size: 100.0,
            src: 'https://example.com/user_avatar.png', // 替换为你的图片网络地址
            borderRadius: 6.0,
          ),
        ),
      ),
    );
  }
}

class Avatar extends StatelessWidget {
  final double size;
  final String src;
  final double borderRadius;

  const Avatar({
    Key? key,
    required this.size,
    required this.src,
    this.borderRadius = 6.0,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ClipRRect(
      borderRadius: BorderRadius.circular(borderRadius),
      child: CachedNetworkImage(
        imageUrl: src,
        width: size,
        height: size,
        fit: BoxFit.cover,
        placeholder: (context, url) => SizedBox(
          width: size,
          height: size,
          child: Center(child: CircularProgressIndicator()),
        ),
        errorWidget: (context, url, error) => Container(
          color: Colors.grey[300],
          width: size,
          height: size,
          child: Icon(Icons.person, size: size / 2),
        ),
      ),
    );
  }
}

请确保替换 'https://example.com/user_avatar.png' 为一个有效的图片URL以正确显示网络图像。

此外,你还可以进一步定制进度指示器,为它添加颜色或动画。对于CircularProgressIndicator,你可以设置valueColor属性来改变颜色。例如:

Dart 复制代码
CircularProgressIndicator(
  valueColor: AlwaysStoppedAnimation<Color>(Theme.of(context).primaryColor),
),

这里是如何为 CircularProgressIndicator 设置颜色的示例:

Dart 复制代码
// ...
placeholder: (context, url) => SizedBox(
  width: size,
  height: size,
  child: Center(
    child: CircularProgressIndicator(
      valueColor: AlwaysStoppedAnimation<Color>(Theme.of(context).primaryColor),
    ),
  ),
),
// ...

在上述代码中,我们使用 Theme.of(context).primaryColor 来获取当前主题的主色调,并将其应用到 CircularProgressIndicator,使得加载动画与应用的主题色保持一致。此外,AlwaysStoppedAnimation 包裹颜色值,使得该动画值在动画期间保持不变。

如需进一步定制,还可以调整加载指示器的大小、宽度等属性。例如,要设置不同的进度指示器大小,你可以使用 ContainerSizedBox 来限制其大小:

Dart 复制代码
placeholder: (context, url) => SizedBox(
  width: size,
  height: size,
  child: Center(
    child: CircularProgressIndicator(
      strokeWidth: 2.0, // 设置进度指示器的线条宽度
      valueColor: AlwaysStoppedAnimation<Color>(Theme.of(context).primaryColor),
    ),
  ),
),

在这里,strokeWidth 属性决定了 CircularProgressIndicator 的线条宽度。你可以根据自己的设计需求来调整这个值。

通过以上的讲解和代码示例,你现在应该能够在 Flutter 应用中创建一个带有网络图片、圆角、大小定制,并且在加载过程中有进度指示器的头像组件了。记得始终在使用第三方资源时审查其许可协议,确保你的应用遵循了所有必要的法律指导原则。

问题

该组件好像用作背景图的缓存时,有问题: stackoverflow.com/questions/7...

github.com/Baseflow/fl...

相关推荐
i-阿松!30 分钟前
PCB板子+ flutter前端 + go后端
物联网·flutter·pcb工艺·go1.19
恋猫de小郭43 分钟前
Flutter 3.41.6 版本很重要,你大概率需要更新一下
android·前端·flutter
亚历克斯神12 小时前
Flutter for OpenHarmony: Flutter 三方库 mutex 为鸿蒙异步任务提供可靠的临界资源互斥锁(并发安全基石)
android·数据库·安全·flutter·华为·harmonyos
钛态12 小时前
Flutter 三方库 smartstruct 鸿蒙化字段映射适配指南:介入静态预编译引擎扫除视图及数据模型双向强转类型错乱隐患,筑稳如磐石的企业级模型治理防线-适配鸿蒙 HarmonyOS ohos
flutter·华为·harmonyos
键盘鼓手苏苏12 小时前
Flutter 组件 csv2json 适配鸿蒙 HarmonyOS 实战:高性能异构数据转换,构建 CSV 流式解析与全栈式数据映射架构
flutter·harmonyos·鸿蒙·openharmony
左手厨刀右手茼蒿12 小时前
Flutter 组件 http_requests 适配鸿蒙 HarmonyOS 实战:极简网络请求,构建边缘端轻量级 RESTful 通讯架构
网络·flutter·http
雷帝木木12 小时前
Flutter 三方库 hrk_logging 的鸿蒙化适配指南 - 实现标准化分层日志记录、支持多目的地输出与日志分级过滤
flutter·harmonyos·鸿蒙·openharmony·hrk_logging
左手厨刀右手茼蒿13 小时前
Flutter 三方库 dio_compatibility_layer 的鸿蒙化适配指南 - 实现 Dio 跨主版本的平滑迁移、支持遗留拦截器兼容与网络请求架构稳定升级
flutter·harmonyos·鸿蒙·openharmony·dio_compatibility_layer
雷帝木木13 小时前
Flutter 三方库 hashids2 基于鸿蒙安全内核的深度隐匿映射适配:数字指纹泄露防御层、生成短小精悍唯一不可逆加盐哈希,护航全链路请求 URL 隐私-适配鸿蒙 HarmonyOS ohos
安全·flutter·harmonyos
王码码203515 小时前
Flutter 组件 inappwebview_cookie_manager 适配 鸿蒙Harmony 实战 - 驾驭核心大 Web 容器缓存隧道、构建金融级政企应用绝对防串号跨域大隔离基座
flutter·harmonyos·鸿蒙·openharmony·inappwebview_cookie_manager