Flutter與Xcode那些事

Hi, 各位看官, 里邊請! ??
最近在搞Flutter, 來跟各位隨便嘮嘮! 今天我們不說語法, 也不說 widget 哈! 有興趣的小伙伴可以點擊鏈接去查看Flutter相關內容!

今天跟看官們說說, Flutter 與 iOS交互的那些事! 由于我的本沒有安裝 Android Studio, 則用VS Code來說, 本期主要圍繞著 Xcode 來講!
關于安卓其結構都一樣, 后期會推出!

在iOS 原有的項目中集成Flutter

原有的項目我就不做展示了哈, 我用一個Demo 來演示! 其效果是一樣

  • 首先打開終端, 輸入 flutter create --template module my_flutter, 創建 module, 命名為my_flutter

    然后打開module, ( Tip: 在集成進 Xcode之前, model 最好先運行起來)

  • 我相信身為iOS開發者對CocoaPods都不陌生吧, 本期將通過CocoaPods管理, 把剛剛創建的 Flutter module 集成到項目中

1.打開 Podfile 文件, 在其中添加 module 本地路徑:

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

# 添加模塊所在路徑
flutter_application_path = '../my_flutter'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')


target 'useFlutter' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!
  # 安裝Flutter模塊
  install_all_flutter_pods(flutter_application_path)

end
  1. 添加完成后,保存退出! 然后 pod install

3.打開Xcode項目, 在AppDelegate中創建引擎

class AppDelegate: UIResponder, UIApplicationDelegate {

    // 1. 創建 flutterEngine  name: 引擎名稱
    lazy var flutterEngine = FlutterEngine(name: "Evan_Engine")

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        // 2.啟動引擎
        flutterEngine.run()
        
        return true
    }
}

4.來到 ViewController中來使用 Flutter module

// 該函數為Button點擊事件
@IBAction func flutterPush(_ sender: Any) {
        // 3. 創建FlutterViewController對象(需要先獲取flutterEngine)
        let flutterEngine = (UIApplication.shared.delegate as! AppDelegate).flutterEngine;
        let flutterViewController = FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil);
        flutterViewController.modalPresentationStyle = .fullScreen
        self.present(flutterViewController, animated: true, completion: nil)
  }

我們也可以省略預先創建的 FlutterEngine :
但不推薦這樣來做,因為在第一針圖像渲染完成之前,可能會出現明顯的延遲。

@IBAction func flutterPush(_ sender: Any) {
  let flutterViewController = FlutterViewController(project: nil, nibName: nil, bundle: nil)
  present(flutterViewController, animated: true, completion: nil)
}
  1. 把項目運行起來, 點擊Button, 來看看效果


哈哈, 是不是感覺好簡單!

Tip: 不要把 widget 作為 view 來與原生的同一個頁面上混用, 可能會有不可預知行為! 切記切記

  • 雖說是用Xcode在運行, 但我們還是可以繼續來使用 Hot Reload


  1. 打開 module, 在終端執行 flutter attach, 鏈接成功后, 如下圖


2.此時我們就可以去修改代碼, 將 Text 字體顏色改為red, 修改完后先保存, 然后在VS Code 終端中輸入 r, 則執行了Hot reload, 此時屏幕也隨之發生了改變, 大功告成! ??


注意: 目前一些場景依然是有限制的:
  • 運行多個Flutter實例,或在屏幕局部上運行Flutter可能會導致不可以預測的行為;
  • 在后臺模式使用Flutter的能力還在開發中(目前不支持);
  • 將Flutter庫打包到另一個可共享的庫或將多個Flutter庫打包到同一個應用中,都不支持;
  • 添加到應用在Android平臺的實現基于 FlutterPlugin 的 API,一些不支持FlutterPlugin 的插件可能會有不可預知的行為。
Flutter 與 iOS 交互
  • 打開Flutter 項目, 創建 StatefulWidget,
    1. 創建通信對象 MethodChannel
    2. 調用原生的函數 getOriginalContent
class MyInteractionBody extends StatefulWidget {
  @override
  _MyInteractionBodyState createState() => _MyInteractionBodyState();
}

class _MyInteractionBodyState extends State<MyInteractionBody> {

// 1.創建通信對象  MethodChannel 
static const platForm = MethodChannel('Evan_channel');

  var _content = '文案';

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
      Text(_content),
      SizedBox(height: 10,),
      TextButton(
      child: Text('調用原生函數'), 
      onPressed: getContent)
    ],
    ),
    );
  }

  void getContent() async {
    // 2. 調用原生的函數 getOriginalContent, 等待回調
    final result = await platForm.invokeMethod('getOriginalContent');
    setState(() {
      _content = result;
    });
  }
}

  1. 使用Xcode打開Flutter 中 ios文件中的項目, 在需要處添加以下代碼
// 1.獲取 FlutterViewController
    if let controller: FlutterViewController = window.rootViewController as? FlutterViewController {
        
        // 2. FlutterMethodChannel
        let channel = FlutterMethodChannel(name: "Evan_channel", binaryMessenger: controller.binaryMessenger)
        
        // 3.監聽 channel 調用方法
        channel.setMethodCallHandler { (call: FlutterMethodCall, result:  @escaping FlutterResult) in
            // 函數名稱
            if call.method == "getOriginalContent" {

                // 如果沒有獲取到,那么返回給Flutter端一個異常
                // result(FlutterError(code: "0", message: "錯誤", details: nil))
            
                // 通過result將結果回調給Flutter端
                result(self.getOriginalContent())
            } else {
                // 未找到
               result(FlutterMethodNotImplemented)
            }
        }
    }

func getOriginalContent() -> String { "已經與原生成功交互" }

到此交互就可以使用了!

好了, Flutter 與 Xcode 交互這點事, 大體上也都跟各位看官嘮完了, 以上只是一些基本簡單用法, 更多的技能還需要用各位去探索, 研究哦!

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

推薦閱讀更多精彩內容