Flutter微光加載動畫

簡介

在應用程序開發中,加載時間是不可避免的。從用戶體驗 (UX) 的角度來看,最重要的是向用戶展示正在加載。向用戶傳達數據正在加載的一種流行方法是在近似加載的內容類型的形狀上顯示帶有微光動畫的鍍鉻顏色。

Shimmer 用于在應用程序中從服務器加載內容時添加精彩的動畫。這使 UI 看起來更具響應性。它可以很好地被利用,而不是傳統的 ProgressBar 或 Flutter 結構中可訪問的常見loading。

適用場景

商品列表、我的收藏、預售活動、商品詳情等類似頁面。

效果圖

商品列表頁 我的收藏

微光動畫效果屬性介紹

|

屬性

|

描述

|
|

baseColor

|

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

|
|

highlightColor

|

提供微光般效果的顏色。這種顏色繼續在子小部件上波動,并產生微光效果

|
|

child

|

創建 ShimmerEffect 所需的任何小部件

|
|

direction

|

調整微光高光顏色的方向。從左到右、從右到左、從開始到結束或從底到頂

|
|

period

|

控制微光效果的速度。默認1500毫秒

|

具體實現

1.添加依賴-pubspec.yaml

shimmer: ^2.0.0

2.創建微光動畫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.創建通用商品Item微光加載Widget

備注:如果通用的Widget與某個頁面完全不一致,需要單獨定義一套。將原有item布局的組件統一替換成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值,是否是初始化加載標識

比如:bool _initLoading=true。默認為true;網絡請求回調后,將其置為false。

5.build繪制列表頁時處理

5.1 _initLoading = true 場景

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

if (_initLoading) { return CommonProductItemShimmer();}

5.2 _initLoading = false 場景

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

官網案例

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372

推薦閱讀更多精彩內容