最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Flutter開發(fā)一個圖片緩存清理插件

 更新時間:2025年06月24日 10:38:02   作者:愛吃魚的鍋包肉  
在flutter開發(fā)中,當(dāng)App項目內(nèi)存吃緊時,頁面中如果圖片很多時需要及時清理,本文小編就和大家分享一下如何開發(fā)一個圖片緩存清理插件吧

在flutter開發(fā)中,當(dāng)App項目內(nèi)存吃緊時,頁面中如果圖片很多時需要及時清理,如果不能及時清理,會造成內(nèi)存泄漏,導(dǎo)致App卡頓甚至強制退出或手機死機。

這里我使用extended_image封裝了一個全局可用的Widget,親測IOS和安卓好用。

首先在pubspec.yaml文件中配置插件并下載,執(zhí)行Pub get。

dependencies:
  extended_image: ^6.2.0

我使用的是6.2.0版本,基于ExtendedImage我對netWork網(wǎng)絡(luò)圖片組件做了如下封裝,內(nèi)有注釋與備注,就不做過多的解釋了,完全都能看的懂!

class JudgeNetworkImage extends StatefulWidget {
  const JudgeNetworkImage(
    this.url, {
    Key? key,
    this.width,
    this.height,
    this.isAvatar = false,
    this.fit = BoxFit.cover,
    this.borderRadius,
    this.shape,
    this.borderWidth = 0.0,
    this.borderColor,
    this.opacity = 1.0,
    this.scale = 1.0,
    this.maxBytes,
    this.filterQuality = FilterQuality.low,
    this.repeat = ImageRepeat.noRepeat,
    this.replaceImgPlayback = false,
    this.enableMemoryCache = true,
    this.clearMemoryCacheIfFailed = true,
    this.clearMemoryCacheWhenDispose = true,
    this.cacheRawData = false,
    this.placeholder,
    this.errorWidget,
    this.loadingWidget,
    this.defaultImagePath,
  }) : super(key: key);

  final String url; // 圖片URL
  final double? width; // 寬度
  final double? height; // 高度
  final bool isAvatar; // 是否為頭像
  final BoxFit fit; // 適配方式
  final BorderRadius? borderRadius; // 圓角
  final BoxShape? shape; // 形狀(圓形/矩形)
  final double borderWidth; // 邊框?qū)挾?
  final Color? borderColor; // 邊框顏色
  final double opacity; // 透明度
  final double scale; // 縮放比例
  final int? maxBytes; // 控制圖片加載時的字節(jié)大小限制
  final FilterQuality filterQuality; // 縮放質(zhì)量
  final ImageRepeat repeat; // 重復(fù)方式
  final bool replaceImgPlayback; // 更換圖片時是否保留舊圖
  final bool enableMemoryCache; // 啟用內(nèi)存緩存
  final bool clearMemoryCacheIfFailed; // 加載失敗時清除緩存
  final bool clearMemoryCacheWhenDispose; // 組件銷毀時清除緩存
  final bool cacheRawData; // 緩存原始數(shù)據(jù)
  final Widget? placeholder; // 加載中占位圖
  final Widget? errorWidget; // 加載失敗組件
  final Widget? loadingWidget; // 加載中組件
  final String? defaultImagePath; // 默認(rèn)圖片路徑

  @override
  State<JudgeNetworkImage> createState() => _JudgeNetworkImageState();
}

class _JudgeNetworkImageState extends State<JudgeNetworkImage> {
  late String _url;

  @override
  void initState() {
    super.initState();
    _url = widget.url;
  }

  @override
  void dispose() {
    super.dispose();
    if (widget.clearMemoryCacheWhenDispose) {
      // 主動清除圖片緩存
      if (_url.isNotEmpty && _url != (widget.defaultImagePath ?? '')) {
        final provider = ExtendedNetworkImageProvider(_url);
        provider.evict();
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    Widget child = Container(
      width: widget.width ?? double.maxFinite,
      height: widget.height ?? double.maxFinite,
      decoration: BoxDecoration(
        // 邊框部分
        border: widget.borderWidth > 0
            ? Border.all(
                color: widget.borderColor ?? Colors.transparent,
                width: widget.borderWidth,
              )
            : null,
      ),
      child: ExtendedImage.network(
        _url,
        width: widget.width,
        height: widget.height,
        fit: widget.fit,
        scale: widget.scale,
        filterQuality: widget.filterQuality,
        repeat: widget.repeat,
        gaplessPlayback: widget.replaceImgPlayback,
        enableMemoryCache: widget.enableMemoryCache,
        clearMemoryCacheIfFailed: widget.clearMemoryCacheIfFailed,
        clearMemoryCacheWhenDispose: widget.clearMemoryCacheWhenDispose,
        cacheRawData: widget.cacheRawData,
        maxBytes: widget.maxBytes,
        // 應(yīng)用透時度
        color: widget.opacity < 1.0
            ? Colors.white.withOpacity(widget.opacity)
            : null,
        colorBlendMode: widget.opacity < 1.0 ? BlendMode.srcIn : null,
        clipBehavior: Clip.none,
        // 加載狀態(tài)回調(diào)
        loadStateChanged: (state) {
          return _handleLoadState(state);
        },
      ),
    );

    if (widget.shape == BoxShape.circle) {
      return ClipOval(
        child: child,
      );
    } else if (widget.borderRadius != null) {
      return ClipRRect(
        borderRadius: widget.borderRadius,
        child: child,
      );
    } else {
      return child;
    }
  }

  /// 處理加載狀態(tài)
  Widget _handleLoadState(ExtendedImageState state) {
    switch (state.extendedImageLoadState) {
      case LoadState.loading:
        // 加載中顯示指示器
        return SizedBox(
          width: widget.width != null ? widget.width! * 0.4 : 42.rpx,
          child: Center(
            child: CircularProgressIndicator(
              valueColor:
                  const AlwaysStoppedAnimation<Color>(AppColors.success),
              strokeWidth: 4.rpx,
            ),
          ),
        );
      case LoadState.completed:
        return state.completedWidget;
      case LoadState.failed:
        // 加載失敗 - 顯示默認(rèn)圖片并清除緩存
        _clearCacheOnError(state);
        return Container(
          color: const Color(0xFFF2F2F2),
          alignment: Alignment.center,
          child: widget.isAvatar
              ? Image.asset(
                  '${AppGlobal.imgUrl}man_presuppose.png',
                  fit: BoxFit.fill,
                )
              : Image.asset(
                  '${AppGlobal.imgUrl}not_pic.png',
                  width: widget.width != null ? widget.width! * 0.6 : 64.rpx,
                  fit: BoxFit.fitWidth,
                ),
        );
    }
  }

  void _clearCacheOnError(ExtendedImageState state) {
    if (widget.clearMemoryCacheIfFailed && mounted) {
      // 獲取圖片提供者并清除緩存
      if (state.imageProvider is ExtendedNetworkImageProvider) {
        final provider = state.imageProvider as ExtendedNetworkImageProvider;
        provider.evict();
      }
    }
  }
}

以上就是一個完整的網(wǎng)絡(luò)圖片widget的封裝,對性能提升有相當(dāng)大的幫助!

到此這篇關(guān)于基于Flutter開發(fā)一個圖片緩存清理插件的文章就介紹到這了,更多相關(guān)Flutter圖片緩存清理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android利用Camera實現(xiàn)中軸3D卡牌翻轉(zhuǎn)效果

    Android利用Camera實現(xiàn)中軸3D卡牌翻轉(zhuǎn)效果

    這篇文章主要介紹了Android利用Camera實現(xiàn)中軸3D卡牌翻轉(zhuǎn)效果,需要的朋友可以參考下
    2015-12-12
  • Android中ADB命令用法大結(jié)局

    Android中ADB命令用法大結(jié)局

    adb全名android debug bridge 安卓調(diào)試橋,下面這篇文章主要給大家介紹了關(guān)于Android中ADB命令用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Android實現(xiàn)簡潔的APP更新dialog數(shù)字進度條

    Android實現(xiàn)簡潔的APP更新dialog數(shù)字進度條

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)簡潔的APP更新dialog數(shù)字進度條,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • android中強制更新app實例代碼

    android中強制更新app實例代碼

    本篇文章主要介紹了android中強制更新app實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • android自動生成dimens適配文件的圖文教程詳解(無需Java工具類)

    android自動生成dimens適配文件的圖文教程詳解(無需Java工具類)

    這篇文章主要介紹了android自動生成dimens適配文件,無需Java工具類,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Android實現(xiàn)輪播圖無限循環(huán)效果

    Android實現(xiàn)輪播圖無限循環(huán)效果

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)輪播圖無限循環(huán)效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • android 獲取手機GSM/CDMA信號信息,并獲得基站信息的方法

    android 獲取手機GSM/CDMA信號信息,并獲得基站信息的方法

    下面小編就為大家?guī)硪黄猘ndroid 獲取手機GSM/CDMA信號信息,并獲得基站信息的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • Android 抽屜效果的導(dǎo)航菜單實現(xiàn)代碼實例

    Android 抽屜效果的導(dǎo)航菜單實現(xiàn)代碼實例

    本篇文章主要介紹了Android 抽屜效果的導(dǎo)航菜單實現(xiàn)代碼實例,這種側(cè)滑的抽屜效果的菜單很好,有興趣的可以了解一下。
    2016-12-12
  • Android FTP服務(wù)器上傳文件攻略(代碼詳解)

    Android FTP服務(wù)器上傳文件攻略(代碼詳解)

    這篇文章主要介紹了Android FTP服務(wù)器上傳文件攻略,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Android中Volley框架下保持會話方法

    Android中Volley框架下保持會話方法

    這個是基于session的一個網(wǎng)絡(luò)會話,手機app給服務(wù)器發(fā)送登陸請求的時候,服務(wù)器返回的網(wǎng)絡(luò)response(networkRespone)的頭(head)里面存放著你想要的sessionid。這篇文章主要介紹了Android中Volley框架下保持會話方法的相關(guān)資料,需要的朋友可以參考下
    2016-11-11

最新評論

赤城县| 德钦县| 曲水县| 呼玛县| 唐河县| 清水河县| 青川县| 循化| 萝北县| 奉新县| 景德镇市| 黔江区| 宽城| 黄石市| 大方县| 青川县| 沈丘县| 自贡市| 炎陵县| 钦州市| 安龙县| 江陵县| 雷波县| 七台河市| 鄂托克前旗| 青浦区| 尚义县| 贞丰县| 乐安县| 迁西县| 民乐县| 房山区| 衡阳县| 岳普湖县| 永善县| 正蓝旗| 庆云县| 静安区| 清徐县| 东至县| 炎陵县|