Flutter開發(fā)windows應用手記(一)

序言

一直做移動app開發(fā)柠掂,最近項目需要涨颜,著手第一個windows應用開發(fā)费韭,從0到1,算是邊學邊用吧庭瑰。
首先做技術分析星持,開發(fā)windows應用最常用的方案,便是microsoft官方的visualStudio弹灭,github上許多項目都是采用vs加C#開發(fā)的钉汗,由于自己的技術儲備是Flutter,而flutter官方是支持桌面應用開發(fā)的鲤屡,所以更加傾向于選擇flutter.
網(wǎng)上查了個遍损痰,關于flutter開發(fā)桌面應用的博文太少了【评矗看到幾篇都是舊版本的卢未,根本用不了,于是選擇走官方文檔路線堰汉。

新手上路

  1. 依據(jù)官方文檔辽社,安裝開發(fā)環(huán)境。

Windows 的額外要求
要開發(fā) Windows 桌面程序翘鸭,除了 Flutter SDK滴铅,你還需要做以下準備:

  • Visual Studio 2022Visual Studio 2022 生成工具 在選擇安裝 Visual Studio 時或只安裝生成工具的時候,你需要選擇「使用 C++ 的桌面開發(fā)」就乓,包括其所有默認組件汉匙,以安裝必要的 C++ 工具鏈和 Windows SDK 的頭文件。
  1. 創(chuàng)建一個包含桌面支持的新應用
flutter create my_app
# 根目錄下
cd my_app
flutter run -d windows
# flutter run -d macos
  1. 為已有的應用添加桌面支持
#從項目根目錄在控制臺運行下面命令:
 flutter create --platforms=windows,macos,linux .

設置創(chuàng)建窗口屬性

  1. windows/runner/main.cpp文件中:
  int screenWidth = GetSystemMetrics(SM_CXSCREEN);   // 獲取屏幕寬度
  int screenHeight = GetSystemMetrics(SM_CYSCREEN);  // 獲取屏幕高度

  FlutterWindow window(project);
  Win32Window::Point origin(screenWidth/2 - 600, screenHeight/2 - 350);
  Win32Window::Size size(1200, 700);

  if (!window.CreateAndShow(chineseString, origin, size)) {
    return EXIT_FAILURE;
  }
  window.SetQuitOnClose(true);

  // 將窗口置于前臺
  SetForegroundWindow(window.GetHandle());
  1. pubspec.yaml文件中引入window_manager(窗口管理庫)和system_tray(管理右下角狀態(tài)欄圖標):
dependencies:
  flutter:
    sdk: flutter
  get: ^4.6.5
  rxdart: ^0.27.3
  path_provider: ^2.0.11
  connectivity_plus: ^5.0.1
  logger: ^1.1.0
  intl: ^0.18.0
  flutter_localization: ^0.1.12
  flutter_phoenix: ^1.1.1
  dio: ^5.1.1
  dio_cache_interceptor: ^3.4.2
  shared_preferences: ^2.0.8
  encrypt: ^5.0.1
  pull_to_refresh: ^2.0.0
  lottie: ^1.4.1
  fast_cached_network_image: ^1.2.0
  flutter_widget_from_html_core: ^0.10.3
  qr_flutter: ^4.1.0
  dart_ping: ^9.0.0
  auto_size_text: ^3.0.0
  url_launcher: ^6.1.12
  image_picker: ^1.0.1
  crop_image: ^1.0.10
  image_compression: ^1.0.4
  package_info_plus: ^4.1.0
  clipboard: ^0.1.3
  file_picker: ^6.1.1
  window_manager: ^0.3.4
  system_tray: ^2.0.3
  1. 創(chuàng)建基類baseApp:
class BaseApp extends StatefulWidget {
  const BaseApp({Key? key}) : super(key: key);

  @override
  State<BaseApp> createState() => _BaseAppState();
}

class _BaseAppState extends State<BaseApp> with WidgetsBindingObserver {
  @override
  Widget build(BuildContext context) {
    // 見window_manager官方文檔
    final virtualWindowFrameBuilder = VirtualWindowFrameInit();

    return RefreshConfiguration(
      hideFooterWhenNotFull: false, // Viewport不滿一屏時,禁用上拉加載更多功能
      enableBallisticLoad: true, // 可以通過慣性滑動觸發(fā)加載更多
      child: GetMaterialApp(
        scrollBehavior: MyCustomScrollBehavior(),
        debugShowCheckedModeBanner: false,
        initialRoute: AppPages.initial,
        getPages: AppPages.routes,
        builder: (context, child) {
          child = virtualWindowFrameBuilder(context, child);
          return child;
        },
        //home: const SizedBox(),
      ),
    );
  }
}
class MyCustomScrollBehavior extends MaterialScrollBehavior {
  @override
  Set<PointerDeviceKind> get dragDevices => {
        PointerDeviceKind.touch,
        PointerDeviceKind.mouse,
      };
}
  1. lib/main.dart文件中:
import 'package:fast_cached_network_image/fast_cached_network_image.dart';
import 'package:flutter/material.dart';

import 'package:window_manager/window_manager.dart';

import 'base/base_app.dart';
import 'common/global.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Global.init();
  // 初始化網(wǎng)絡圖片緩存時間
  await FastCachedImageConfig.init(clearCacheAfter: const Duration(days: 1));
  await windowManager.ensureInitialized();
  WindowOptions windowOptions = const WindowOptions(
    size: Size(1200, 700),
    backgroundColor: Colors.transparent,
    skipTaskbar: false,
    titleBarStyle: TitleBarStyle.hidden,
    title: "軟件名稱",
    windowButtonVisibility: false,
    // alwaysOnTop: true,
    center: true,
  );
  windowManager.waitUntilReadyToShow(windowOptions, () async {
    windowManager.setAsFrameless(); //無邊框
    windowManager.setHasShadow(false); //這里不能有陰影生蚁,否則會出現(xiàn)一個透明外框
    windowManager.setMaximizable(false);
    windowManager.setResizable(false);
    // windowManager.setAlwaysOnTop(true); //始終置于其它應用上層
    await windowManager.show();
    await windowManager.focus();
  });
  runApp(const BaseApp());
}

至此噩翠,一個基本框架已經(jīng)搭建好了,運行目標選擇Windows(desktop)邦投,即可看到效果伤锚。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市志衣,隨后出現(xiàn)的幾起案子屯援,更是在濱河造成了極大的恐慌,老刑警劉巖念脯,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狞洋,死亡現(xiàn)場離奇詭異,居然都是意外死亡和二,警方通過查閱死者的電腦和手機徘铝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門耳胎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惯吕,“玉大人惕它,你說我怎么就攤上這事》系牵” “怎么了淹魄?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長堡距。 經(jīng)常有香客問我甲锡,道長,這世上最難降的妖魔是什么羽戒? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任缤沦,我火速辦了婚禮,結果婚禮上易稠,老公的妹妹穿的比我還像新娘缸废。我一直安慰自己,他們只是感情好驶社,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布企量。 她就那樣靜靜地躺著,像睡著了一般亡电。 火紅的嫁衣襯著肌膚如雪届巩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天份乒,我揣著相機與錄音恕汇,去河邊找鬼。 笑死或辖,一個胖子當著我的面吹牛拇勃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播孝凌,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼方咆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蟀架?” 一聲冷哼從身側(cè)響起瓣赂,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎片拍,沒想到半個月后煌集,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡捌省,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年苫纤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡卷拘,死狀恐怖喊废,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情栗弟,我是刑警寧澤污筷,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站乍赫,受9級特大地震影響瓣蛀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雷厂,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一惋增、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧改鲫,春花似錦器腋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讲弄,卻和暖如春措左,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背避除。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工怎披, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瓶摆。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓凉逛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親群井。 傳聞我的和親對象是個殘疾皇子状飞,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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