一区二区三区欧美日韩-一区二区三区欧美-一区二区三区免费在线视频-一区二区三区免费在线观看-久久精品店-久久精品第一页

歡迎您光臨深圳塔燈網(wǎng)絡(luò)科技有限公司!
電話圖標(biāo) 余先生:13699882642

網(wǎng)站百科

為您解碼網(wǎng)站建設(shè)的點點滴滴

現(xiàn)有iOS工程引入Flutter

發(fā)表日期:2018-10 文章編輯:小燈 瀏覽次數(shù):1732

前言

Flutter 是一個很有潛力的框架,但是目前使用Flutter的APP并不算很多,相關(guān)資料并不豐富,介紹現(xiàn)有工程引入Flutter的相關(guān)文章也比較少。項目從零開始,引入Flutter操作比較簡單,但是現(xiàn)有工程引入Flutter 需要費(fèi)很多精力和時間,這里是我在完成現(xiàn)有iOS工程引入Flutter后寫的一次總結(jié)文章。

Flutter 環(huán)境搭建

首先是要搭建Flutter環(huán)境,之前也寫了一篇相關(guān)文章搭建Flutter-iOS開發(fā)環(huán)境,可以參考一下
可以去官網(wǎng)查看:https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps
比較簡單,這里不做贅述。

現(xiàn)有iOS工程引入Flutter

一、建立Flutter module

首先建立flutter module,主要是用于獲取改flutter app中的Generated.xcconfig和framework

cd some/path/ $ flutter create -t module my_flutter 

也可以用

flutter create app 

建立flutter app,flutter app中也有Generated.xcconfig和framework

二、新建配置文件

根據(jù)官網(wǎng),需要在工程中建立三個配置文件:
Flutter.xcconfig 、Debug.xcconfigRelease.xcconfig
在XCode工程對應(yīng)目錄,右擊,選擇新建文件(New File),選中創(chuàng)建xcconfig文件,如圖:

Flutter.xcconfig中填寫:
 //這里填寫前面建立的flutter module 的Generated.xcconfig的路徑 #include "../../my_flutter/.ios/Flutter/Generated.xcconfig" ENABLE_BITCODE=NO 
Debug.xcconfig中填寫:
#include "../Flutter/Flutter.xcconfig"

Release.xcconfig中填寫:

#include "../Flutter/Flutter.xcconfig" FLUTTER_BUILD_MODE=release 

如果工程中用cocoapods管理,需要在 Debug.xcconfigRelease.xcconfig添加pod的路徑:

例如 Release.xcconfig

#include "Flutter.xcconfig" #include "工程路徑/Pods/Target Support Files/******.release.xcconfig"http://pod路徑 FLUTTER_BUILD_MODE=release 

在準(zhǔn)備好這些xcconfig文件后,需要到XCode工程PROJECT(注意是PROJECT,不是Target)中的Configuration選項里,將對應(yīng)的target選擇成前面的xcconfig文件,Debug用Debug.xcconfig, Release用 Release.xcconfig

注意:進(jìn)行Archive打包的時候,無論是Debug包還是Release包,需要切換到Release.xcconfig,不然會報錯。

三、為編譯Dart引入相關(guān)build phase

在工程的Build Phase中新建一個Run Script,用于編譯時運(yùn)行腳本,
建立方法如圖:

建立Run Script后,需要移動其對應(yīng)的位置,需要在Target dependencies之后,如果用cocoapods管理工程需要在,Check Pods Manifest.lock之后:

在腳本框中,填入以下代碼,用于引進(jìn)Flutter中的xcode_backend腳本:

"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build 

如圖:


四、生成和添加Framework

完成前面的配置后,便可以在XCode對工程進(jìn)行編譯build (Command+B),在提示“ Build Success ” 后,在iOS工程文件夾中會生成一個Flutter文件夾,將其加入工程目錄中,建議和剛才xcconfig所在目錄并列,

右鍵項目目錄 ,選擇 Add Files to 'xxx' ,Options選Create groups,添加編譯生成的Flutter文件夾。需要注意但是:Flutter目錄下有個flutter_assets文件,不能使用Create groups的方式添加,只能用Creat folder references的Options, 否則Flutter頁面會空白渲染不出來??梢詣h了flutter_assets在用Creat folder references重新添加。

在添加完Flutter 文件夾之后,去Embeded Binaries中添加App.frameworkFlutter.framework

五、AppDelegate改造

Flutter需要和APP進(jìn)行交互,需要對AppDelegate 進(jìn)行改造:

AppDelegate.h文件中:

#import <Flutter/Flutter.h>@interface AppDelegate : FlutterAppDelegate <UIApplicationDelegate, FlutterAppLifeCycleProvider>@end 

AppDelegate.m 文件中:

#import "AppDelegate.h"@interface AppDelegate ()@end@implementation AppDelegate { FlutterPluginAppLifeCycleDelegate *_lifeCycleDelegate; }- (instancetype)init { if (self = [super init]) { _lifeCycleDelegate = [[FlutterPluginAppLifeCycleDelegate alloc] init]; } return self; }- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { return [_lifeCycleDelegate application:application didFinishLaunchingWithOptions:launchOptions]; }- (void)applicationDidEnterBackground:(UIApplication*)application { [_lifeCycleDelegate applicationDidEnterBackground:application]; }- (void)applicationWillEnterForeground:(UIApplication*)application { [_lifeCycleDelegate applicationWillEnterForeground:application]; }- (void)applicationWillResignActive:(UIApplication*)application { [_lifeCycleDelegate applicationWillResignActive:application]; }- (void)applicationDidBecomeActive:(UIApplication*)application { [_lifeCycleDelegate applicationDidBecomeActive:application]; }- (void)applicationWillTerminate:(UIApplication*)application { [_lifeCycleDelegate applicationWillTerminate:application]; }- (void)application:(UIApplication*)application didRegisterUserNotificationSettings:(UIUserNotificationSettings*)notificationSettings { [_lifeCycleDelegate application:application didRegisterUserNotificationSettings:notificationSettings]; }- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken { [_lifeCycleDelegate application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; }- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler { [_lifeCycleDelegate application:applicationdidReceiveRemoteNotification:userInfofetchCompletionHandler:completionHandler]; }- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id>*)options { return [_lifeCycleDelegate application:application openURL:url options:options]; }- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url { return [_lifeCycleDelegate application:application handleOpenURL:url]; }- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplicationannotation:(id)annotation { return [_lifeCycleDelegate application:applicationopenURL:urlsourceApplication:sourceApplication annotation:annotation]; }- (void)application:(UIApplication*)application performActionForShortcutItem:(UIApplicationShortcutItem*)shortcutItem completionHandler:(void (^)(BOOL succeeded))completionHandler NS_AVAILABLE_IOS(9_0) { [_lifeCycleDelegate application:applicationperformActionForShortcutItem:shortcutItem completionHandler:completionHandler]; }- (void)application:(UIApplication*)application handleEventsForBackgroundURLSession:(nonnull NSString*)identifier completionHandler:(nonnull void (^)(void))completionHandler { [_lifeCycleDelegate application:application handleEventsForBackgroundURLSession:identifier completionHandler:completionHandler]; }- (void)application:(UIApplication*)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler { [_lifeCycleDelegate application:application performFetchWithCompletionHandler:completionHandler]; }- (void)addApplicationLifeCycleDelegate:(NSObject<FlutterPlugin>*)delegate { [_lifeCycleDelegate addDelegate:delegate]; }

六、新建FlutterViewController

主要配置基本上已經(jīng)完成,只要在main.dart實現(xiàn)Flutter的業(yè)務(wù)代碼即可


在原有工程中 ,建立FlutterViewController來承載main.dart實現(xiàn)的Flutter頁面,如:

self.flutterViewController = [[FlutterViewController alloc] initWithProject:nil nibName:nil bundle:nil]; [self.navigationController pushViewController:self.flutterViewController animated:YES]; 

后語

到這里現(xiàn)有iOS工程引入Flutter的工作就完成了,一些細(xì)節(jié)上的修改需要根據(jù)場景進(jìn)行修改,例如Flutter和Native的數(shù)據(jù)通信等。


本頁內(nèi)容由塔燈網(wǎng)絡(luò)科技有限公司通過網(wǎng)絡(luò)收集編輯所得,所有資料僅供用戶學(xué)習(xí)參考,本站不擁有所有權(quán),如您認(rèn)為本網(wǎng)頁中由涉嫌抄襲的內(nèi)容,請及時與我們聯(lián)系,并提供相關(guān)證據(jù),工作人員會在5工作日內(nèi)聯(lián)系您,一經(jīng)查實,本站立刻刪除侵權(quán)內(nèi)容。本文鏈接:http://www.junxiaosheng.cn/18169.html
相關(guān)APP開發(fā)
 八年  行業(yè)經(jīng)驗

多一份參考,總有益處

聯(lián)系深圳網(wǎng)站公司塔燈網(wǎng)絡(luò),免費(fèi)獲得網(wǎng)站建設(shè)方案及報價

咨詢相關(guān)問題或預(yù)約面談,可以通過以下方式與我們聯(lián)系

業(yè)務(wù)熱線:余經(jīng)理:13699882642

Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.    

主站蜘蛛池模板: 免费国产福利| 亚洲色tu| 成年人国产视频| 神马电影院午夜神福利在线观看| 国产国拍亚洲精品永久软件| 香蕉久久夜色精品国产小优| 久久99re6热在线播放| 99日韩精品| 性吧 校园春色| 两百磅美女| 国产传媒18精品A片在线观看| 亚洲区视频在线观看| 欧美18videosex初次| 国产伦子沙发午休系列资源曝光| 野花社区视频WWW高清| 飘雪在线观看免费高清完整版韩国| 国产精品无需播放器| 主播蜜汁丝袜精品自拍| 色情内射少妇兽交| 久久久GOGO无码啪啪艺术| 超碰最新网站| 在线播放日韩欧美亚洲日本| 十分钟免费视频大全在线观看| 久久精品国产欧美成人| 丰满大爆乳波霸奶| 中字幕视频在线永久在线观看免费 | 阿v天堂2017在无码| 亚洲精品国产SUV| 日本动漫henta videos| 久久久久综合网久久| 国产精品久久久久影院嫩草| 中文在线中文资源| 侮辱丰满美丽的人妻| 欧美xxxav| 精品夜夜澡人妻无码AV蜜桃| 俄罗斯爱爱| 99午夜视频| 伊人色综合久久大香| 无码欧美XXXXX在线观看裸| 暖暖视频 免费 高清 日本8| 久久国内精品视频|