Flutter微光加載動畫

簡介

在應(yīng)用程序開發(fā)中志群,加載時間是不可避免的。從用戶體驗(yàn) (UX) 的角度來看欧漱,最重要的是向用戶展示正在加載退唠。向用戶傳達(dá)數(shù)據(jù)正在加載的一種流行方法是在近似加載的內(nèi)容類型的形狀上顯示帶有微光動畫的鍍鉻顏色。

Shimmer 用于在應(yīng)用程序中從服務(wù)器加載內(nèi)容時添加精彩的動畫窜醉。這使 UI 看起來更具響應(yīng)性宪萄。它可以很好地被利用,而不是傳統(tǒng)的 ProgressBar 或 Flutter 結(jié)構(gòu)中可訪問的常見loading酱虎。

適用場景

商品列表雨膨、我的收藏、預(yù)售活動读串、商品詳情等類似頁面聊记。

效果圖

商品列表頁 我的收藏

微光動畫效果屬性介紹

|

屬性

|

描述

|
|

baseColor

|

顯示在 Widget 上的 Shimmer 的基本顏色

|
|

highlightColor

|

提供微光般效果的顏色。這種顏色繼續(xù)在子小部件上波動恢暖,并產(chǎn)生微光效果

|
|

child

|

創(chuàng)建 ShimmerEffect 所需的任何小部件

|
|

direction

|

調(diào)整微光高光顏色的方向排监。從左到右、從右到左杰捂、從開始到結(jié)束或從底到頂

|
|

period

|

控制微光效果的速度舆床。默認(rèn)1500毫秒

|

具體實(shí)現(xiàn)

1.添加依賴-pubspec.yaml

shimmer: ^2.0.0

2.創(chuàng)建微光動畫Widget-ShimmerLoading

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

/// @author: niumenglin
/// @time: 2021/11/29-2:40 下午
/// @Email: menglin.nml@ncarzone.com
/// @desc:Flutter 微光動畫效果
class ShimmerLoading extends StatelessWidget {
  final double width;
  final double height;
  final ShapeBorder shapeBorder;

  ///方形 
  const ShimmerLoading.rectangular(
      {this.width = double.infinity, required this.height})
      : this.shapeBorder = const RoundedRectangleBorder();
  ///圓形 
  const ShimmerLoading.circular(
      {this.width = double.infinity,
      required this.height,
      this.shapeBorder = const CircleBorder()});

  @override
  Widget build(BuildContext context) => Shimmer.fromColors(
        baseColor: Colors.grey[300]!,
        highlightColor: Colors.grey[100]!,
        period: Duration(seconds: 2),
        child: Container(
          width: width,
          height: height,
          decoration: ShapeDecoration(
            color: Colors.grey[400]!,
            shape: shapeBorder,
          ),
        ),
      );
}

3.創(chuàng)建通用商品Item微光加載Widget

備注:如果通用的Widget與某個頁面完全不一致,需要單獨(dú)定義一套嫁佳。將原有item布局的組件統(tǒng)一替換成ShimmerLoading.rectangular或ShimmerLoading.circular即可挨队。

import 'package:flutter/material.dart';
import 'package:flutter_yonline/widget/shimmer/shimmer_loading.dart';

/// @author: niumenglin
/// @time: 2021/11/29-2:45 下午
/// @Email: menglin.nml@ncarzone.com
/// @desc:通用商品Item 微光加載布局
class CommonProductItemShimmer extends StatefulWidget {
  const CommonProductItemShimmer({Key? key}) : super(key: key);

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

class _CommonProductItemShimmerState extends State<CommonProductItemShimmer> {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Container(
          color: Colors.white,
          padding: EdgeInsets.all(10),
          child: Row(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              ShimmerLoading.rectangular(width: 85, height: 85),
              Expanded(
                  child: Container(
                margin: EdgeInsets.only(left: 10),
                child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      ShimmerLoading.rectangular(height: 16),
                      SizedBox(
                        height: 10,
                      ),
                      Container(
                        margin: EdgeInsets.only(top: 10),
                        child:
                            ShimmerLoading.rectangular(width: 140, height: 14),
                      ),
                      SizedBox(
                        height: 10,
                      ),
                      ShimmerLoading.rectangular(width: 80, height: 18),
                      SizedBox(
                        height: 10,
                      ),
                      ShimmerLoading.rectangular(height: 12),
                    ]),
              ))
            ],
          ),
        ),
        Divider(
          height: 10,
          indent: 10,
          color: Color(0xffD8D8D8),
        )
      ],
    );
  }
}

4.定義一個全局bool值,是否是初始化加載標(biāo)識

比如:bool _initLoading=true蒿往。默認(rèn)為true盛垦;網(wǎng)絡(luò)請求回調(diào)后,將其置為false瓤漏。

5.build繪制列表頁時處理

5.1 _initLoading = true 場景

  • 設(shè)置ListView的itemCount屬性腾夯,itemCount>=一個屏幕的可見數(shù)量;
  • 設(shè)置itemBuilder 即通用的微光加載布局。

if (_initLoading) { return CommonProductItemShimmer();}

5.2 _initLoading = false 場景

  • 設(shè)置ListView的itemCount屬性蔬充,xxxList集合長度
  • 設(shè)置itemBuilder 即你原本創(chuàng)建的item布局蝶俱。
NCZListView(
    .....
    itemCount: _initLoading ? 10 : model.products.length,
    itemBuilder: (_, index) {
      if (_initLoading) {
        return CommonProductItemShimmer();
      }else {
          return _buildYourItem();
     }
}),

官網(wǎng)案例

https://flutter.cn/docs/cookbook/effects/shimmer-loading

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市饥漫,隨后出現(xiàn)的幾起案子榨呆,更是在濱河造成了極大的恐慌,老刑警劉巖趾浅,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愕提,死亡現(xiàn)場離奇詭異馒稍,居然都是意外死亡皿哨,警方通過查閱死者的電腦和手機(jī)浅侨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來证膨,“玉大人如输,你說我怎么就攤上這事⊙肜眨” “怎么了不见?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長崔步。 經(jīng)常有香客問我稳吮,道長,這世上最難降的妖魔是什么井濒? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任灶似,我火速辦了婚禮,結(jié)果婚禮上瑞你,老公的妹妹穿的比我還像新娘酪惭。我一直安慰自己,他們只是感情好者甲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布春感。 她就那樣靜靜地躺著,像睡著了一般虏缸。 火紅的嫁衣襯著肌膚如雪鲫懒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天刽辙,我揣著相機(jī)與錄音窥岩,去河邊找鬼。 笑死扫倡,一個胖子當(dāng)著我的面吹牛谦秧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撵溃,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疚鲤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缘挑?” 一聲冷哼從身側(cè)響起集歇,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎语淘,沒想到半個月后诲宇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體际歼,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年姑蓝,在試婚紗的時候發(fā)現(xiàn)自己被綠了鹅心。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡纺荧,死狀恐怖旭愧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宙暇,我是刑警寧澤输枯,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站占贫,受9級特大地震影響桃熄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜型奥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一瞳收、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桩引,春花似錦缎讼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至厘灼,卻和暖如春夹纫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背设凹。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工舰讹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闪朱。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓月匣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親奋姿。 傳聞我的和親對象是個殘疾皇子锄开,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容