flutter的UIKitView和platformview之iOS

flutter添加iOS原生的platformview,
遇到的问题:

//关于编码格式一定要和ios那边统一,并且和传递的参数类型匹配,
//如果flutter传递的是json,map,编码必须是JSONMessageCodec,
//flutter传递的是string,编码必须是Stringcodec,否则会出错,加载不了view

flutter代码:

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(widget.title),),
      body: Container(
        width:300,
        height:300,
        child: UiKitView(
            viewType: "iosview",
            onPlatformViewCreated:onPlatformViewCreated,
            creationParams:{"a":"1"},
            //关于编码格式一定要和ios那边统一,并且和传递的参数类型匹配,
            //如果flutter传递的是json,map,编码必须是JSONMessageCodec,
            //flutter传递的是string,编码必须是Stringcodec,否则会出错,加载不了view
            creationParamsCodec:JSONMessageCodec()
        ),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
  Future<void> onPlatformViewCreated(int id) async {
    print("**********ok***********id="+id.toString());
  }

iOS代码:
1,创建viewplugin,实现FlutterPlugin协议,在GeneratedPluginRegistrant类中注册插件。

@implementation GeneratedPluginRegistrant
+ (void)registerWithRegistry:(NSObject<FlutterPluginRegistry>*)registry {
    [ViewPlugin registerWithRegistrar:[registry registrarForPlugin:@"ViewPlugin"]];
}
@end
#import <Foundation/Foundation.h>
#import <Flutter/Flutter.h>
NS_ASSUME_NONNULL_BEGIN
@interface ViewPlugin : NSObject<FlutterPlugin>
@end
NS_ASSUME_NONNULL_END

#import "ViewPlugin.h"
#import "ViewFactory.h"
@implementation ViewPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar
{
    ViewFactory *fc = [[ViewFactory alloc] initWith:registrar];
    [registrar registerViewFactory:fc withId:@"iosview"];
}
@end

2,创建ViewFactory类实现FlutterPlatformViewFactory协议,

#import <Foundation/Foundation.h>
#import <Flutter/Flutter.h>
NS_ASSUME_NONNULL_BEGIN
@interface ViewFactory : NSObject<FlutterPlatformViewFactory>
- (instancetype)initWith:(NSObject<FlutterPluginRegistrar>*)registrar;
@end
NS_ASSUME_NONNULL_END

#import "ViewFactory.h"
#import "IOSView.h"
@interface ViewFactory()
{
    id<FlutterPluginRegistrar> _registrar;
}

@end
@implementation ViewFactory
- (instancetype)initWith:(NSObject<FlutterPluginRegistrar>*)registrar
{
    self = [super init];
    if (self) {
        _registrar = registrar;
    }
    return self;
}
//实现协议方法,flutter根据widget自动计算出iOS的frame,
//自动生成的viewId和flutter那边对应,flutter传的参数args
- (NSObject<FlutterPlatformView>*)createWithFrame:(CGRect)frame
                                   viewIdentifier:(int64_t)viewId
                                        arguments:(id _Nullable)args
{
    NSLog(@"====---f--==%@",NSStringFromCGRect(frame));
    NSLog(@"====-----==%d",viewId);
    NSLog(@"=======%@",args);
    IOSView *view = [[IOSView alloc] init];
    [view createWithFrame:frame viewIdentifier:viewId arguments:args];
    return view;
}

//关于编码格式一定要和flutter那边统一,并且和传递的参数类型匹配,
//如果flutter传递的是json,map,编码必须是JSONMessageCodec,
//flutter传递的是string,编码必须是Stringcodec,否则会出错,加载不了view
- (NSObject<FlutterMessageCodec>*)createArgsCodec
{
    return  [[FlutterJSONMessageCodec alloc] init];
}

@end

3,创建IOSView实现协议,在这个类中创建iOS的view,并返回给flutter

#import <UIKit/UIKit.h>
#import <Flutter/Flutter.h>
NS_ASSUME_NONNULL_BEGIN

@interface IOSView : NSObject<FlutterPlatformView>
- (void)createWithFrame:(CGRect)frame
                                   viewIdentifier:(int64_t)viewId
                                        arguments:(id _Nullable)args;
@end

NS_ASSUME_NONNULL_END
#import "IOSView.h"

@interface IOSView()
{
//这是要添加到flutter上的view,
    UIView *_view;
}
@end
@implementation IOSView
- (void)createWithFrame:(CGRect)frame viewIdentifier:(int64_t)viewId arguments:(id _Nullable)args
{
    _view = [[UIView alloc] initWithFrame:frame];
    [_view setBackgroundColor:[UIColor redColor]];
    
}
//实现协议方法,返回ios的view给flutter
- (UIView*)view
{
    return  _view;
}

@end
上一篇:iOS Runtime面试题(一个objc对象的isa的指针指向什么?有什么作用?)


下一篇:面试驱动技术之 - isa && 元类 && 函数调用