国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Flutter iOS 集成使用 flutter boost

這篇具有很好參考價(jià)值的文章主要介紹了Flutter iOS 集成使用 flutter boost。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

在 Flutter項(xiàng)目中集成完 flutter boost,并且已經(jīng)使用了 flutter boost進(jìn)行了路由管理,這時(shí)如果需要和iOS混合開發(fā),這時(shí)就要到 原生端進(jìn)行集成。

注意:之前建的項(xiàng)目必須是 Flutter module項(xiàng)目,并且原生項(xiàng)目和flutter module項(xiàng)目在同一個(gè)文件夾下面

下面是原生端集成 flutter boost的步驟:

  • 在原生項(xiàng)目的 Podfile文件中添加如下代碼
# Uncomment the next line to define a global platform for your project
platform :ios, '12.0'


flutter_application_path = '../my_flutter'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')


target 'FlutterList' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for FlutterList
  install_all_flutter_pods(flutter_application_path)
  

  pod 'Masonry', '1.0.2'
  
end


post_install do |installer|
  flutter_post_install(installer) if defined?(flutter_post_install)
end

填寫完后指向 pod install。此時(shí)項(xiàng)目的pod目錄下面就會(huì)出現(xiàn) flutter相關(guān)的庫
Flutter iOS 集成使用 flutter boost,Flutter 提升之路,ios,flutter,cocoa
到此就完成 flutter混合開發(fā)的集成工作,接下來就是需要 編寫使用代碼

  • 編寫混合開發(fā)代碼
    這里沒有跟著flutter boost 官網(wǎng)進(jìn)行集成 https://github.com/alibaba/flutter_boost/blob/master/docs/install.md 創(chuàng)建代碼,稍微進(jìn)行了些改進(jìn)。

  • HYFlutterBoostDelegate

  • HYFlutterViewContainer

  • HYFlutterViewController
    分別創(chuàng)建了以上代碼,并且在AppDelegate 中使用 FlutterBoost。

  • HYFlutterBoostDelegate

import Foundation
import flutter_boost

class HYFlutterBoostDelegate: NSObject, FlutterBoostDelegate {
    
    ///您用來push的導(dǎo)航欄
    var navigationController:UINavigationController? {
        return UINavigationController.topNavigationController()?.navigationController
    }

    ///用來存返回flutter側(cè)返回結(jié)果的表
    var resultTable:Dictionary<String,([AnyHashable:Any]?)->Void> = [:];
    
    func pushNativeRoute(_ pageName: String!, arguments: [AnyHashable : Any]!) {

        //可以用參數(shù)來控制是push還是pop
        let isPresent = arguments["isPresent"] as? Bool ?? false
        let isAnimated = arguments["isAnimated"] as? Bool ?? true
        //這里根據(jù)pageName來判斷生成哪個(gè)vc,這里給個(gè)默認(rèn)的了
        let targetViewController = UIViewController()
        
        // 這里也可以使用路由進(jìn)行跳轉(zhuǎn)
        
        if(isPresent){
            self.navigationController?.present(targetViewController, animated: isAnimated, completion: nil)
        }else{
            self.navigationController?.pushViewController(targetViewController, animated: isAnimated)
        }
    }
    
    func pushFlutterRoute(_ options: FlutterBoostRouteOptions!) {
        let vc:HYFlutterViewController = HYFlutterViewController()
        vc.setName(options.pageName, uniqueId: options.uniqueId, params: options.arguments,opaque: options.opaque)
        vc.hidesBottomBarWhenPushed = true
        //對(duì)這個(gè)頁面設(shè)置結(jié)果
        resultTable[options.pageName] = options.onPageFinished;
        if let nav = navigationController  {
            nav.pushViewController(vc, animated: true)
        }
        
    }
    
    
    func popRoute(_ options: FlutterBoostRouteOptions!) {
        //如果當(dāng)前被present的vc是container,那么就執(zhí)行dismiss邏輯
        if let vc = self.navigationController?.presentedViewController as? HYFlutterViewController, vc.uniqueIDString() == options.uniqueId{
            
            //這里分為兩種情況,由于UIModalPresentationOverFullScreen下,生命周期顯示會(huì)有問題
            //所以需要手動(dòng)調(diào)用的場景,從而使下面底部的vc調(diào)用viewAppear相關(guān)邏輯
            if vc.modalPresentationStyle == .overFullScreen {
                
                //這里手動(dòng)beginAppearanceTransition觸發(fā)頁面生命周期
                self.navigationController?.topViewController?.beginAppearanceTransition(true, animated: false)
                
                vc.dismiss(animated: true) {
                    self.navigationController?.topViewController?.endAppearanceTransition()
                }
            }else{
                //正常場景,直接dismiss
                vc.dismiss(animated: true, completion: nil)
            }
        }else{
            self.navigationController?.popViewController(animated: true)
        }
        //否則直接執(zhí)行pop邏輯
        //這里在pop的時(shí)候?qū)?shù)帶出,并且從結(jié)果表中移除
        if let onPageFinshed = resultTable[options.pageName] {
            onPageFinshed(options.arguments)
            resultTable.removeValue(forKey: options.pageName)
        }
    }
    
}
  • HYFlutterViewContainer
#import <flutter_boost/FlutterBoost.h>

NS_ASSUME_NONNULL_BEGIN

@interface HYFlutterViewContainer : FBFlutterViewContainer

@end

NS_ASSUME_NONNULL_END
#import "HYFlutterViewContainer.h"

@interface HYFlutterViewContainer (){
    UINavigationBar *_bar;
}

@property (nonatomic)BOOL navigationBarHidden;
@property (nonatomic, strong) FBVoidCallback removeEventCallback;

@end

@implementation HYFlutterViewContainer

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:YES animated:animated];
}

/// 設(shè)置這個(gè)container對(duì)應(yīng)的從flutter過來的事件監(jiān)聽
-(void)setupEventListeningFromFlutter{
    __weak typeof(self) weakSelf = self;
    // 為這個(gè)容器注冊監(jiān)聽,監(jiān)聽內(nèi)部的flutterPage往這個(gè)容器發(fā)的事件
    self.removeEventCallback = [FlutterBoost.instance addEventListener:^(NSString *name, NSDictionary *arguments) {
        __strong typeof(self) strongSelf = weakSelf;
        //事件名
        NSString *event = arguments[@"event"];
        //事件參數(shù)
        NSDictionary *args = arguments[@"args"];
        
        if ([event isEqualToString:@"enablePopGesture"]) {
            // 多page情況下的側(cè)滑動(dòng)態(tài)禁用和啟用事件
            NSNumber *enableNum = args[@"enable"];
            BOOL enable = [enableNum boolValue];
            //右滑控制
//            strongSelf.fd_interactivePopDisabled = !enable;
        }
    } forName:self.uniqueId];
}

- (BOOL)navigationBarHidden {
    return YES;
}

- (UINavigationBar *)navBar
{
    if (!_bar) {
        _bar = [UINavigationBar new];
    }
    return _bar;
}

- (BOOL)shouldAutorotate
{
    return NO;
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}


@end
  • HYFlutterViewController
#import <UIKit/UIKit.h>
#import "HYFlutterViewContainer.h"


@interface HYFlutterViewController : UIViewController

@property (nonatomic, strong) HYFlutterViewContainer *container;

- (NSString *)uniqueIDString;

- (void)setName:(NSString *)name uniqueId:(NSString *)uniqueId params:(NSDictionary *)params opaque:(BOOL) opaque;

@end

#import "HYFlutterViewController.h"
#import <Masonry/Masonry.h>
#import "UINavigationController+HY.h"


@interface HYFlutterViewController ()

@end

@implementation HYFlutterViewController


- (void)setName:(NSString *)name uniqueId:(NSString *)uniqueId params:(NSDictionary *)params opaque:(BOOL) opaque {
    _container = [HYFlutterViewContainer new];
    [_container setName:name uniqueId:uniqueId params:params opaque:opaque];
}


- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    // 隱藏導(dǎo)航欄
    [self.container.navigationController setNavigationBarHidden:YES animated:YES];
    
    [self addChildViewController:_container];
    [_container didMoveToParentViewController:self];
    
    [self.view addSubview:_container.view];
    [_container.view mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.mas_equalTo(UIEdgeInsetsZero);
    }];
}



- (NSString *)uniqueIDString {
    return self.container.uniqueIDString;
}

- (void)dealloc {
    [_container removeFromParentViewController];
    [_container didMoveToParentViewController:nil];
}

@end

  • AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    HYFlutterBoostDelegate* delegate = [[HYFlutterBoostDelegate alloc]init];
    
    [FlutterBoost.instance setup:application delegate:delegate callback:^(FlutterEngine *engine) {
        NSLog(@"FlutterBoost 開始操作");
        
    }];
    
    self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];
    
    ViewController* VC = [[ViewController alloc]init];
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:VC];

    self.window.rootViewController = nav;
    [self.window makeKeyAndVisible];
    
    return YES;
}

使用 Flutter boost進(jìn)行調(diào)轉(zhuǎn)

- (void)btnClick:(UIButton *)btn {
    FlutterBoostRouteOptions* option = [[FlutterBoostRouteOptions alloc]init];
    option.pageName = @"/";
    [[[FlutterBoost instance] plugin].delegate pushFlutterRoute:option];
}

到此flutter boost原生交互使用結(jié)束,此時(shí)進(jìn)到flutter界面導(dǎo)航是沒有左側(cè)的返回按鈕的,這需要自己處理。文章來源地址http://www.zghlxwxcb.cn/news/detail-638181.html

到了這里,關(guān)于Flutter iOS 集成使用 flutter boost的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Flutter如何集成到已有iOS工程上

    Flutter如何集成到已有iOS工程上

    大家好,我是咕嚕鐵蛋,今天我將和大家分享一個(gè)實(shí)用的技術(shù)教程——如何將Flutter集成到已有的iOS工程中。Flutter是Google推出的一款開源的移動(dòng)UI框架,它允許開發(fā)者使用Dart語言來開發(fā)高性能、美觀的原生應(yīng)用,并支持iOS和Android兩大平臺(tái)。然而,在實(shí)際開發(fā)中,我們經(jīng)常會(huì)遇

    2024年04月12日
    瀏覽(38)
  • 一統(tǒng)天下 flutter - 插件: flutter 使用 ios 原生控件,并做數(shù)據(jù)通信

    源碼 https://github.com/webabcd/flutter_demo 作者 webabcd 示例如下: libpluginplugin2.dart iosRunnerAppDelegate.swift iosRunnerMyFlutterPlugin2.swift iosRunnerMyView.swift 源碼 https://github.com/webabcd/flutter_demo 作者 webabcd

    2024年02月03日
    瀏覽(25)
  • 如何在 macOS 上同時(shí)使用 Flutter2 和 Flutter3 進(jìn)行 ios 開發(fā)

    如何在 macOS 上同時(shí)使用 Flutter2 和 Flutter3 進(jìn)行 ios 開發(fā)

    貓哥主打系統(tǒng)環(huán)境是: macos flutter 3.7.12 ruby 3.2.2 cocoapods 1.12.1 xcode 14.3.1 這套配置運(yùn)行最新的項(xiàng)目沒問題,但是最近需要維護(hù) flutter 2.10.5 這種老項(xiàng)目,雖然用了 fvm 進(jìn)行 flutter 版本切換,但是 flutter 2.10.5 用的 ruby 2 ,我當(dāng)前是 ruby 3 所以運(yùn)行 pod install 的時(shí)候就報(bào)錯(cuò)了。 這個(gè)錯(cuò)誤

    2024年02月12日
    瀏覽(27)
  • 集成學(xué)習(xí)算法梯度提升(gradient boosting)的直觀看法

    集成學(xué)習(xí)算法梯度提升(gradient boosting)的直觀看法

    reference: Intuitive Ensemble Learning Guide with Gradient Boosting 梯度提升算法的核心思想:使用前一個(gè)模型的殘差作為下一個(gè)模型的目標(biāo)。 使用單個(gè)機(jī)器學(xué)習(xí)模型可能并不總是適合數(shù)據(jù)。優(yōu)化其參數(shù)也可能無濟(jì)于事。一種解決方案是將多個(gè)模型組合在一起以擬合數(shù)據(jù)。本教程以梯度提

    2023年04月09日
    瀏覽(18)
  • Flutter ios 使用ListView 。滾動(dòng)時(shí) AppBar 改變顏色問題

    Flutter ios 使用ListView 。滾動(dòng)時(shí) AppBar 改變顏色問題

    在Ios 中 列表滾動(dòng)條向下滾動(dòng)一段距離后 會(huì)導(dǎo)致 AppBar 顏色改變? 可以給 AppBar 或者 AppBarTheme。 scrolledUnderElevation: 0.0 屬性 全局: 局部: 效果:? 滾動(dòng)前 滾動(dòng)后 x ke z

    2024年04月17日
    瀏覽(20)
  • 【flutter】使用permission_handler配置android和 iOS的權(quán)限

    flutter在pub.flutter-io.cn插件庫中有很多的關(guān)于權(quán)限配置的插件,但是就我個(gè)人而言,比較推薦使用permission_handler這個(gè)插件。當(dāng)我們打開permission_handler時(shí)候,往往新手小白會(huì)因?yàn)樗墓倬W(wǎng)文檔而弄的一頭霧水,權(quán)限配置往往涉及到android和ios兩個(gè)方向的相關(guān)知識(shí),有可能大多數(shù)人就

    2024年02月12日
    瀏覽(23)
  • 機(jī)器學(xué)習(xí)集成學(xué)習(xí)——GBDT(Gradient Boosting Decision Tree 梯度提升決策樹)算法

    機(jī)器學(xué)習(xí)集成學(xué)習(xí)——GBDT(Gradient Boosting Decision Tree 梯度提升決策樹)算法

    機(jī)器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)——Adaboost分離器算法 機(jī)器學(xué)習(xí)之SVM分類器介紹——核函數(shù)、SVM分類器的使用 機(jī)器學(xué)習(xí)的一些常見算法介紹【線性回歸,嶺回歸,套索回歸,彈性網(wǎng)絡(luò)】 文章目錄 系列文章目錄 前言 一、GBDT(Gradient Boosting Decision Tree) 梯度提升決策樹簡介 1.1、集成學(xué)習(xí) 1.2、

    2024年02月09日
    瀏覽(24)
  • Flutter iOS 與 flutter 相互通信

    在混合開發(fā)中避免不了通信,簡單記錄一下,F(xiàn)lutter iOS工程與Flutter 之間相互通信。 Flutter 中通過Platform Channel實(shí)現(xiàn)Flutter和原生端的數(shù)據(jù)傳遞,是怎么進(jìn)行數(shù)據(jù)通信,以及怎么配置,下面一一進(jìn)行詳解。 通過Platform channel 將傳遞的數(shù)據(jù)以發(fā)送消息的形式。 跨線程發(fā)送到iOS端和

    2024年02月13日
    瀏覽(22)
  • flutter開發(fā)實(shí)戰(zhàn)-MethodChannel實(shí)現(xiàn)flutter與iOS雙向通信

    flutter開發(fā)實(shí)戰(zhàn)-MethodChannel實(shí)現(xiàn)flutter與iOS雙向通信 最近開發(fā)中需要iOS與flutter實(shí)現(xiàn)通信,這里使用的MethodChannel 如果需要flutter與Android實(shí)現(xiàn)雙向通信,請看 https://blog.csdn.net/gloryFlow/article/details/132218837 這部分與https://blog.csdn.net/gloryFlow/article/details/132218837中的一致,這里實(shí)現(xiàn)一下

    2024年02月13日
    瀏覽(25)
  • Flutter 3.10 之 Flutter Web 路線已定,可用性進(jìn)一步提升,快來嘗鮮 WasmGC

    Flutter 3.10 之 Flutter Web 路線已定,可用性進(jìn)一步提升,快來嘗鮮 WasmGC

    隨著 Flutter 3.10 發(fā)布,F(xiàn)lutter Web 也引來了它最具有「里程碑」意義的更新, 這里的「里程碑」不是說這次 Flutter Web 有多么重大的更新,而是 Flutter 官方對(duì)于 Web 終于有了明確的定位和方向 。 首先我們簡單聊提升,這不是本篇的重點(diǎn),只是順帶。 本次提升主要在于兩個(gè)大點(diǎn):

    2024年02月05日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包