發表文章

目前顯示的是 9月, 2022的文章

Flutter 動態配置多環境 - iOS Scheme 配置

圖片
iOS app 同樣也有區分 app 名稱和套件名稱的需求,但現在嘗試帶 --flavor 參數建置 iOS 版 app 的時候,會得到以下訊息: 字面上的意思是沒有設定自訂 Scheme,稍後要移至 Xcode 進行建立 Scheme 的程序。 建立自訂 Scheme 在 VS Code 對著 ios 資料夾按右鍵,在選單中點擊 Open in Xcode。 在 Android Studio 是在選單中點擊 Flutter -> Open iOS module in Xcode。   出現 Xcode 後,點擊目標選擇器,在出現的選單中點擊 New Scheme…   Target 要選擇 Runner,Name 要輸入與 EnvName 相符的數值,本例為「dev」。並以相同方式建立 beta 的 Scheme。 接著點擊 Manage Schemes… 對著預設的 Runner 按下 Return(Enter) 鍵,重新命名為「prod」。完成每個 Scheme 的建立。   再次嘗試建置 Flutter app ,仍然出現錯誤訊息。 大意是要在 Debug 模式執行 prod 組態,預期會有名為 Debug-prod 的建置設定,但是現在沒有。 建立 Xcode 建置設定 點擊專案檔 -> PROJECT 下的 Runner -> Info 標籤。 在 Configurations 建立所需的設定 Flutter iOS 模組預設存在這 3 種設定: Debug Release Profile 這是對應 Flutter 支援的建置模式,稍後會以這些設定,延伸出本範例需要的設定檔。 更詳細的說明,可見〈 Flutter 的构建模式选择 〉。 按下+按鈕,點擊 Duplicate "Debug" Configuration 選項。在複製出來的項目中,重新命名為「Debug-dev」。其中 Debug 是 Flutter 支援的建置模式之一,dev 是本範例自訂的組態。 以同樣的方式建立「Release-dev」、「Profile-dev」,成果如附圖。   以同樣的方式處理 beta 組態,成果如附圖。   最後將預設的設定名稱,重新命名為 prod 適用的...

Flutter 動態配置多環境 - Android Gradle 配置

圖片
接著要實作更進一步的版本切換機制。 為每個版本,設定各別的 app 名稱和套件名稱。 在 Gradle 新增組態   在 VSCode 對著 android 資料夾點擊右鍵,在選單中點擊 Open in Android Studio。 在 Android Studio 是在選單中點擊 Flutter -> Open Android module in Android Studio。 在 android/app/build.gradle 的 android 區塊內新增以下程式: android { //.... flavorDimensions "app" productFlavors { prod { dimension "app" resValue "string", "app_name", "Build Flavor" applicationId = "com.dispy.buildflavor" } beta { dimension "app" resValue "string", "app_name", "Build Flavor Beta" applicationId = "com.dispy.buildflavor.beta" } dev { dimension "app" resValue "string", "app_name", "Build Flavor Dev" applicationId = "com.dispy.buildflavor.dev" } } }   本例支援 prod、beta、d...

Flutter 讓 app 程式與 WebView 網頁互動

圖片
  在開發行動應用程式時,有時候會利用 WebView 連線到特定的網頁。如果遇到需要 app 端的程式和網頁端互相溝通的話,就可以利用「Javascript bridge」這種概念。它是實作一個介面,讓 app 程式可以呼叫網頁的 Javascript 程式,以此類推。 Android 和 iOS (原生)已有行之有年的做法,Flutter 也可以做到。 建立 Flutter 程式 這裡預期讀者已有基本的 Flutter 觀念,講解大致的流程: 新建 Flutter 專案 匯入 webview_flutter 3.0.4 在主程式中使用 WebView import 'dart:convert' ; import 'package:flutter/material.dart' ; import 'package:flutter/services.dart' ; import 'package:webview_flutter/webview_flutter.dart' ; void main () {   runApp ( const MyApp ()); } class MyApp extends StatelessWidget {   const MyApp ({ Key ? key }) : super ( key : key );   @ override   Widget build ( BuildContext context ) {     return MaterialApp (       title : 'Flutter Demo' ,       theme : ThemeData (         primarySwatch : Colors . blue ,       ),       home : const MyHomePage ( title : 'Flutter Demo Home Page' ),     );   } } class MyH...