主頁 > 移動端開發 > 10分鐘用Flutter寫出摸魚桌面版App

10分鐘用Flutter寫出摸魚桌面版App

2021-12-23 09:53:23 移動端開發

簡介:大家好,我是楓哥🌟一線互聯網的IT民工、📝資深面試官、🌹Java跳蚤網課堂創始人,擁有多年一線研發經驗,曾就職過科大訊飛、美團網、平安等公司,在上海有自己小伙伴組建的副業團隊,目前業余時間專注Java技術分享,春招/秋招/社招/跳槽,一對一學習輔助,專案接活開發,

🎉🎉掃碼左側二維碼,加入群聊,一起學習,一起進步!

🌟 歡迎關注 🌟 收藏 🌹留言 🌹

🍊🍊:文末送福利

摸魚是不可能摸魚的,這輩子都不會摸魚,

我看了下郭佬分享了一篇微博:微博國際版https://share.api.weibo.cn/share/269008779.html

頓時這個念頭劃過了我的腦海:好東西,但是我用的是 MacBook,不能用這個應用,但是貌似我可以自己寫一個?

準備作業

年輕最需要的就是行動力,想到就干,盡管我此刻正在理順 DevFest 的講稿,但絲毫不妨礙我用 10 分鐘寫一個 App,于是我打出了一套組合拳:

flutter config --enable-macos-desktop
flutter create --platforms=macos touch_fish_on_macos

一個支持 macOS 的 Flutter 專案就創建好了,(此時大約過去了 1 分鐘)

開始敲代碼

找到資源

我們首先需要一張高清無碼的 圖片,這里你可以在網上進行搜尋,有一點需要注意的是,使用 LOGO 要注意使用場景帶來的著作權問題,找到圖片后,丟到 assets/apple-logo.png,并在 pubspec.yaml 中加上資源參考:

flutter:
  use-material-design: true
+ assets:
+   - assets/apple-logo.png

思考布局

我們來觀察一下 macOS 的啟影片面,有幾個要點:

  • LOGO 在螢屏中間,固定大小約為 100dp;
  • LOGO 與進度條間隔約 100 dp;
  • 進度條高度約 5dp,寬度約 200dp,圓角幾乎完全覆寫高度,值部分為白色,背景部分為填充色+淺灰色邊框,

(別問我為什么這些東西能觀察出來,問就是天天教 UI 改 UI,)

確認了大概的布局模式,接下來我們開始搭布局,(此時大約過去了 2 分鐘)

實作布局

首先將 LOGO 居中、著色、設定寬度為 100,上下間隔 100:

return Center(
  child: Column(
    mainAxisAlignment: MainAxisAlignment.center,
    children: <Widget>[
      const Spacer(),
      Padding(
        padding: const EdgeInsets.symmetric(vertical: 100),
        child: Image.asset(
          'assets/apple-logo.png',
          color: CupertinoColors.white, // 使用 Cupertino 系列的白色著色
          width: 100,
        ),
      ),
      const Spacer(),
    ],
  ),
);

然后在下方放一個相對靠上的進度條:

return Center(
  child: Column(
    mainAxisAlignment: MainAxisAlignment.center,
    children: <Widget>[
      const Spacer(),
      Padding(
        padding: const EdgeInsets.symmetric(vertical: 100),
        child: Image.asset(
          'assets/apple-logo.png',
          color: CupertinoColors.white, // 使用 Cupertino 系列的白色
          width: 100,
        ),
      ),
      Expanded(
        child: Container(
          width: 200,
          alignment: Alignment.topCenter, // 相對靠上中部對齊
          child: DecoratedBox(
            border: Border.all(color: CupertinoColors.systemGrey), // 設定邊框
            borderRadius: BorderRadius.circular(10), // 這里的值比高大就行
          ),
          child: ClipRRect(
            borderRadius: BorderRadius.circular(10), // 需要進行圓角裁剪
            child: LinearProgressIndicator(
              value: 0.3, // 當前的進度值
              backgroundColor: CupertinoColors.lightBackgroundGray.withOpacity(.3),
              color: CupertinoColors.white,
              minHeight: 5, // 設定進度條的高度
            ),
          ),
        ),
      ),
    ],
  ),
);

到這里你可以直接 run,一個靜態的界面已經做好了,(此時大約過去了 4 分鐘)

打開 App,你已經可以放在一旁掛機了,老板走到你的身邊,可能會跟你閑聊更新的內容,但是,更新界面不會動,能稱之為更新界面? 當老板一而再再而三地從你身邊經過,發現還是這個進度的時候,也許就已經把你的工資劃掉了,或者第二天你因為進辦公室在椅子上坐下而被辭退,

那么下一步我們就要思考如何讓它動起來,

思考影片

來看看啟動影片大概是怎么樣的:

  • 開始是沒有進度條的;
  • 進度潭訓逐級移動、速度不一定相等,

基于以上兩個條件,我設計了一種影片處理方式:

  • 構造分段的時長 (Duration),可以自由組合由多個時長;
  • 影片通過時長的數量決定每個時長最終的進度;
  • 每段時長控制起始值到結束值的間隔,

只有三個條件,簡單到起飛,開動!(此時大約過去了 5 分鐘)

實作影片

開局一個 AnimationController

class _HomePageState extends State<HomePage> with SingleTickerProviderStateMixin {
  /// 巧用 late 初始化,節省代碼量
  late final AnimationController _controller = AnimationController(vsync: this);

  /// 啟動后等待的時長
  Duration get _waitingDuration => const Duration(seconds: 5);

  /// 分段的影片時長
  List<Duration> get _periodDurations {
    return <Duration>[
      const Duration(seconds: 5),
      const Duration(seconds: 10),
      const Duration(seconds: 4),
    ];
  }

  /// 當前進行到哪一個分段
  final ValueNotifier<int> _currentPeriod = ValueNotifier<int>(1);

接下來實作影片方法,采用了遞回呼叫的方式,減少呼叫鏈的控制:

@override
void initState() {
  super.initState();
  // 等待對應秒數后,開始進度條影片
  Future.delayed(_waitingDuration).then((_) => _callAnimation());
}

Future<void> _callAnimation() async {
  // 取當前分段
  final Duration _currentDuration = _periodDurations[currentPeriod];
  // 準備下一分段
  currentPeriod++;
  // 如果到了最后一個分段,取空
  final Duration? _nextDuration = currentPeriod < _periodDurations.length ? _periodDurations.last : null;
  // 計算當前分段影片的結束值
  final double target = currentPeriod / _periodDurations.length;
  // 執行影片
  await _controller.animateTo(target, duration: _currentDuration);
  // 如果下一分段為空,即執行到了最后一個分段,重設當前分段,影片結束
  if (_nextDuration == null) {
    currentPeriod = 0;
    return;
  }
  // 否則呼叫下一分段的影片
  await _callAnimation();
}

以上短短幾行代碼,就完美的實作了進度條的影片操作,(此時大約過去了 8 分鐘)

最后一步,將影片、分段二者與進度條系結,在沒進入分段前不展示進度條,在影片開始后展示對應的進度:

ValueListenableBuilder<int>(
  valueListenable: _currentPeriod,
  builder: (_, int period, __) {
    // 分段為0時,不展示
    if (period == 0) {
      return const SizedBox.shrink();
    }
    return DecoratedBox(
      decoration: BoxDecoration(
        border: Border.all(color: CupertinoColors.systemGrey),
        borderRadius: BorderRadius.circular(10),
      ),
      child: ClipRRect(
        borderRadius: BorderRadius.circular(10),
        child: AnimatedBuilder( // 使用 AnimatedBuilder,在影片進行時觸發更新
          animation: _controller,
          builder: (_, __) => LinearProgressIndicator(
            value: _controller.value, // 將 controller 的值系結給進度
            backgroundColor: CupertinoColors.lightBackgroundGray.withOpacity(.3),
            color: CupertinoColors.white,
            minHeight: 5,
          ),
        ),
      ),
    );
  },
)

大功告成,總共用時 10 分鐘,讓我們跑起來看看效果,(下圖 22.1 M)

打包發布

發布正式版的 macOS 應用較為復雜,但我們可以打包給自己使用,只需要一行命令即可:flutter build macos

成功后,產物將會輸出在 build/macos/Build/Products/Release/touch_fish_on_macos.app,雙擊即可使用

結語

可能大多數人都沒有想到,撰寫一個 Flutter 應用,跑在 macOS 上,能有這么簡單,當然,看似短暫的 10 分鐘并沒有包括安裝環境、搜索素材、提交到 git 的時間,但在這個時間范圍內,完成相關的事情也是綽綽有余,

🌹 🌹感謝大家,堅持看完,既然選擇了這條路,那就一起加油,一起學習!如果需要學習資源,實戰面試資料,專案資源,關注公眾號:IT楓斗者,🌟根據關鍵字領取對應的資料福利🌟!咨詢解決問題,公眾號私聊楓哥,備注來意,

🍊回復:java全套學習資源

🍊回復:面試資料

🍊回復:楓哥簡歷

🍊回復:程式員表白神器

(從此告別程式員單身狗!)

🍊回復:程式員兼職網站

🍊回復:楓哥666

( 獲取66套專案實戰資料,大廠面試視頻)

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/390663.html

標籤:其他

上一篇:手把手教你完成Android期末大作業(多功能應用型APP)

下一篇:曝 15 寸 iPad 或將變身 Mac?谷歌:大屏設備應具備智能手機體驗

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more