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

Flutter開發(fā)通用頁面Loading組件示例詳解

 更新時間:2022年11月28日 10:34:52   作者:Fitem  
這篇文章主要為大家介紹了Flutter開發(fā)通用頁面Loading組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前沿

頁面通用Loading組件是一個App必不可少的基礎(chǔ)功能,之前只開發(fā)過Android原生的頁面Loading,這次就按原生的邏輯再開發(fā)一個Flutter的Widget,對其進(jìn)行封裝復(fù)用

我們先看下效果:

原理

狀態(tài)

一個通用的頁面加載Loading組件應(yīng)該具備以下幾種狀態(tài):

IDLE 初始化

Idle狀態(tài),此時的組件還只是初始化

LOADING 加載中

Loading狀態(tài),一般在網(wǎng)絡(luò)請求或者耗時加載數(shù)據(jù)時調(diào)用,通用顯示的是一個progress或者自定義的幀動畫

LOADING_SUCCESS

LoadingSuccess加載成功,一般在網(wǎng)絡(luò)請求成功后調(diào)用,并將需要展示的頁面展示出來

LOADING_SUCCESS_BUT_EMPTY

頁面加載成功但是沒有數(shù)據(jù),這種情況一般是發(fā)起列表數(shù)據(jù)請求但是沒有數(shù)據(jù),通常我們會展示一個空數(shù)據(jù)的頁面來提醒用戶

NETWORK_BLOCKED

網(wǎng)絡(luò)錯誤,一般是由于網(wǎng)絡(luò)異常、網(wǎng)絡(luò)請求連接超時導(dǎo)致。此時我們需要展示一個網(wǎng)絡(luò)錯誤的頁面,并且?guī)в兄卦嚢粹o,讓用戶重新發(fā)起請求

ERROR

通常是接口錯誤,這種情況下我們會根據(jù)接口返回的錯誤碼或者錯誤文本提示用戶,并且也有重試按鈕

/// 狀態(tài)枚舉
enum LoadingStatus {
  idle, // 初始化
  loading, // 加載中
  loading_suc, // 加載成功
  loading_suc_but_empty, // 加載成功但是數(shù)據(jù)為空
  network_blocked, // 網(wǎng)絡(luò)加載錯誤
  error, // 加載錯誤
}

點(diǎn)擊事件回調(diào)

當(dāng)網(wǎng)絡(luò)異?;蛘呓涌趫箦e時,會顯示錯誤頁面,并且提供重試按鈕,讓用戶點(diǎn)擊重新請求?;谶@個需求,我們還需要提供點(diǎn)擊重試后的事件回調(diào)讓業(yè)務(wù)可以處理重新請求。

 /// 定義點(diǎn)擊事件
 typedef OnTapCallback = Function(LoadingView widget);

提示文案

提供提示文案的自定義,方便業(yè)務(wù)根據(jù)自己的需求展示特定的提示文案

代碼實(shí)現(xiàn)

根據(jù)上面的原理來實(shí)現(xiàn)對應(yīng)的代碼

  • 構(gòu)造方法
 /// 構(gòu)造方法
 LoadingView({
    Key key,
    @required this.child, // 需要加載的Widget
    @required this.todoAfterError, // 錯誤點(diǎn)擊重試
    @required this.todoAfterNetworkBlocked, // 網(wǎng)絡(luò)錯誤點(diǎn)擊重試
    this.networkBlockedDesc = "網(wǎng)絡(luò)連接超時,請檢查你的網(wǎng)絡(luò)環(huán)境",
    this.errorDesc = "加載失敗",
    this.loadingStatus = LoadingStatus.idle,
 }) : super(key: key);
  • 根據(jù)不同的Loading狀態(tài)展示對應(yīng)的Widget
  • 其中idle、success狀態(tài)直接展示需要加載的Widget(這里也可以使用漸變動畫進(jìn)行切換過度)
 ///根據(jù)不同狀態(tài)展示不同Widget
  Widget _buildBody() {
    switch (widget.loadingStatus) {
      case LoadingStatus.idle:
        return widget.child;
      case LoadingStatus.loading:
        return _buildLoadingView();
      case LoadingStatus.loading_suc:
        return widget.child;
      case LoadingStatus.loading_suc_but_empty:
        return _buildLoadingSucButEmptyView();
      case LoadingStatus.error:
        return _buildErrorView();
      case LoadingStatus.network_blocked:
        return _buildNetworkBlockedView();
    }
    return widget.child;
  }
  • buildLoadingView,這里簡單用了系統(tǒng)的CircularProgressIndicator,也可以自己顯示幀動畫
  /// 加載中 View
  Widget _buildLoadingView() {
    return Container(
      width: double.maxFinite,
      height: double.maxFinite,
      child: Center(
        child: SizedBox(
          height: 22.w,
          width: 22.w,
          child: CircularProgressIndicator(
            strokeWidth: 2,
            valueColor: AlwaysStoppedAnimation<Color>(AppColors.primaryBgBlue),
          ),
        ),
      ),
    );
  }
  • 其他提示頁面,這里做了一個統(tǒng)一的封裝
/// 編譯通用頁面
  Container _buildGeneralTapView({
    String url = "images/icon_network_blocked.png",
    String desc,
    @required Function onTap,
  }) {
    return Container(
      color: AppColors.primaryBgWhite,
      width: double.maxFinite,
      height: double.maxFinite,
      child: Center(
        child: SizedBox(
          height: 250.h,
          child: Column(
            children: [
              Image.asset(url,
                  width: 140.w, height: 99.h),
              SizedBox(
                height: 40.h,
              ),
              Text(
                desc,
                style: AppText.gray50Text12,
                maxLines: 2,
                overflow: TextOverflow.ellipsis,
              ),
              SizedBox(
                height: 30.h,
              ),
              if (onTap != null)
                BorderRedBtnWidget(
                  content: "重新加載",
                  onClick: onTap,
                  padding: 40.w,
                ),
            ],
          ),
        ),
      ),
    );
  }
    /// 加載成功但數(shù)據(jù)為空 View
  Widget _buildLoadingSucButEmptyView() {
    return _buildGeneralTapView(
      url: "images/icon_empty.png",
      desc: "暫無數(shù)據(jù)",
      onTap: null,
    );
  }
  /// 網(wǎng)絡(luò)加載錯誤頁面
  Widget _buildNetworkBlockedView() {
    return _buildGeneralTapView(
        url: "images/icon_network_blocked.png",
        desc: widget.networkBlockedDesc,
        onTap: () {
          widget.todoAfterNetworkBlocked(widget);
        });
  }
  /// 加載錯誤頁面
  Widget _buildErrorView() {
    return _buildGeneralTapView(
        url: "images/icon_error.png",
        desc: widget.errorDesc,
        onTap: () {
          widget.todoAfterError(widget);
        });
  }

使用

  Widget _buildBody() {
     var loadingView = LoadingView(
      loadingStatus: LoadingStatus.loading,
      child: _buildContent(),
      todoAfterNetworkBlocked: (LoadingView widget) {
        // 網(wǎng)絡(luò)錯誤,點(diǎn)擊重試
        widget.updateStatus(LoadingStatus.loading);
        Future.delayed(Duration(milliseconds: 1000), () {
          widget.updateStatus(LoadingStatus.error);
        });
      },
      todoAfterError: (LoadingView widget) {
        // 接口錯誤,點(diǎn)擊重試
        widget.updateStatus(LoadingStatus.loading);
        Future.delayed(Duration(milliseconds: 1000), () {
          // widget.updateStatus(LoadingStatus.loading_suc);
          widget.updateStatus(LoadingStatus.loading_suc_but_empty);
        });
      },
    );
     Future.delayed(Duration(milliseconds: 1000), (){
       loadingView.updateStatus(LoadingStatus.network_blocked);
     });
     return loadingView;
  }

總結(jié)

至此已經(jīng)完成了對整個Loading組件的封裝,代碼已上傳Github

以上就是Flutter開發(fā)通用頁面Loading組件示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Flutter通用頁面Loading組件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android程序開發(fā)之防止密碼輸入錯誤 密碼明文顯示功能

    Android程序開發(fā)之防止密碼輸入錯誤 密碼明文顯示功能

    在使用App的時候,首次登錄都需要用戶輸入密碼的,有些朋友為了安全起見密碼設(shè)置的比較長,導(dǎo)致很多次密碼都輸入錯誤,嚴(yán)重影響了用戶體驗(yàn)效果,下面通過本文給大家介紹Android程序開發(fā)之防止密碼輸入錯誤 密碼明文顯示功能,需要的朋友參考下
    2016-02-02
  • Android開發(fā)之自定義CheckBox

    Android開發(fā)之自定義CheckBox

    本文通過實(shí)例代碼演示如何在Android中如何自定義CheckBox,實(shí)現(xiàn)的效果很好,有需要的可以參考借鑒。
    2016-08-08
  • Android開發(fā)之ProgressBar字體隨著進(jìn)度條的加載而滾動

    Android開發(fā)之ProgressBar字體隨著進(jìn)度條的加載而滾動

    這篇文章主要介紹了Android開發(fā)之ProgressBar字體隨著進(jìn)度條的加載而滾動,需要的朋友可以參考下
    2017-09-09
  • Android TextView實(shí)現(xiàn)多文本折疊、展開效果

    Android TextView實(shí)現(xiàn)多文本折疊、展開效果

    這篇文章主要為大家詳細(xì)介紹了Android TextView實(shí)現(xiàn)多文本折疊、展開效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • android中實(shí)現(xiàn)完全退出程序方法(退出所有activity)

    android中實(shí)現(xiàn)完全退出程序方法(退出所有activity)

    這篇文章主要介紹了android中實(shí)現(xiàn)完全退出程序方法(退出所有activity),本文方法是博主個人使用的一個方法,據(jù)說效果非常好,需要的朋友可以參考下
    2015-05-05
  • Android中的存儲詳解

    Android中的存儲詳解

    大家好,本篇文章主要講的是Android中的存儲詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • Android實(shí)現(xiàn)音頻錄音與播放

    Android實(shí)現(xiàn)音頻錄音與播放

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)音頻錄音與播放,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Android滑動沖突的解決技巧

    Android滑動沖突的解決技巧

    Android滑動沖突是Android開發(fā)中常見的問題,在一個界面中,可能存在多個View可以響應(yīng)滑動事件,如果這些View滑動方向一致,則會導(dǎo)致滑動沖突,本文將從原理、使用與優(yōu)化三個方面,詳細(xì)介紹Android滑動沖突的解決方式,需要的朋友可以參考下
    2024-01-01
  • Android提高之手游轉(zhuǎn)電視游戲的模擬操控

    Android提高之手游轉(zhuǎn)電視游戲的模擬操控

    這篇文章主要介紹了Android手游轉(zhuǎn)電視游戲的模擬操控方法,是非常具有實(shí)用價值的功能,需要的朋友可以參考下
    2014-08-08
  • Android中超大圖片無法顯示的問題解決

    Android中超大圖片無法顯示的問題解決

    最近在工作中發(fā)現(xiàn)一個問題,在做圖片瀏覽的時候發(fā)現(xiàn)超大圖圖片無法顯示,無奈只能上網(wǎng)找解決方法,后來通過測試找到了解決的方法,下面這篇文章就主要介紹了Android中超大圖無法顯示的問題解決方法,需要的朋友可以參考借鑒。
    2017-01-01

最新評論

清水河县| 永德县| 甘孜县| 永寿县| 峨山| 白山市| 通江县| 水富县| 南靖县| 新竹市| 登封市| 如东县| 宁津县| 富民县| 乾安县| 常州市| 洪江市| 绵竹市| 麦盖提县| 昌乐县| 离岛区| 彭泽县| 高密市| 东阳市| 阿拉善盟| 安远县| 桦南县| 宝坻区| 平武县| 英德市| 禹城市| 贡山| 城口县| 磐安县| 噶尔县| 肇州县| 从江县| 历史| 襄樊市| 高阳县| 东阳市|