ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Flutter插件开发踩坑记

2021-03-22 15:00:01  阅读:506  来源: 互联网

标签:坑记 插件 IOS flutter 跳转 Flutter sdk


1.集成其他Flutter插件遇到的问题之一(Missing ‘package’ key)(Android)

问题描述:

D:\flutterSdk\flutter\.pub-cache\hosted\pub.flutter-io.cn%47\wechat_kit-2.0.0\android\src\main\AndroidManifest.xml:6:9-50 Error:

Missing 'package' key attribute on element package at AndroidManifest.xml:6:9-50

D:\flutterSdk\flutter\.pub-cache\hosted\pub.flutter-io.cn%47\wechat_kit-2.0.0\android\src\main\AndroidManifest.xml Error:

Validation failed, exiting

解决办法:

出现这样的问题,原因是因为插件支持了Android 11的版本,在Android 11中跳转到第三方应用需要添加这样的标签在Manifest文件中,
然而出现这样的问题并不是要求我们支持的版本也要支持Android11,而是由于Gralde的版本比较低,识别不了这样的标签,没办法执行打包
这样的操作,我们只需要讲gradle版本升级一下就好了,这里给一个可以正常运行的版本,大家可以尝试一下

classpath 'com.android.tools.build:gradle:3.6.4'

distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip

相信大家应该指导在哪里修改吧。

2.UIKitView收不到Flutter传递参数的问题(IOS)

问题描述:

我们在开发IOS端插件的时候有时候会需要用到IOS的UIView,对应到Flutter中就是UIKitView,
这样就可以讲IOS原生的View和Flutter结合到一个程序中,通常,我们会将Flutter端的一些参数传递到IOS端,
这个地方有一个坑就是,需要重写一个方法,才能接收到Flutter传递的参数,否则接受不到.

解决办法

需要在继承了FlutterPlatformViewFactory这个类中,重写下面这个方法(以下为Swift代码案列)

 func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol {
    return FlutterStandardMessageCodec.sharedInstance()
}

3.Flutter跳转IOS原生页面(跳转IOS原生第三方sdk页面)(IOS)

问题描述:

1.我需要从Flutter 页面中直接打开一个第三方的IOS原生的页面,这个时候就会遇到跳转问题的坑. 
在IOS页面跳转的时候通常需要一个UIViewController,或者是UIViewController里面的navgationViewController(好像是叫这个名字)来进行跳转,对于不熟悉IOS开发的人来说,太难了.(包括我),
通常拿到的UIViewController或者navgationViewController是空的,这个时候跳转就没有效果.下面介绍2种方式. 

知道了问题的原因,所以我们只需要拿到UIViewController或者navgationViewController就可以了(有时候拿到了也不行,好像需要在同一个任务栈)

解决办法

1.通过FlutterViewController

2.模仿官方插件跳转的代码(推荐)


方法一(Swift代码)(不推荐)

//        let window = ((UIApplication.shared.delegate?.window)!)!
//
//
//        let aobjNavi = UINavigationController(rootViewController: FlutterViewController())
//
//        window.rootViewController = aobjNavi


经过我的实践,这样拿到的NavigationController只能跳转一次,第二次好像就没有效果了。所以推荐下面这种方式


方法二(OC代码):

根据Flutter官方提供的插件flutter_webview 里面打开网页的操作我们可以找到相应的代码


//获取UIViewController,然后可以跳转
-(UIViewController *)viewControllerWithWindow:(UIWindow *)window {
 UIWindow *windowToUse = window;
 if (windowToUse == nil) {
     for (UIWindow *window in [UIApplication sharedApplication].windows) {
         if (window.isKeyWindow) {
             windowToUse = window;
             break;
         }
     }
 }
 UIViewController *topController = windowToUse.rootViewController;
 while (topController.presentedViewController) {
 topController = topController.presentedViewController;
 }
 return topController;
}

在使用的时候这样使用

 [[self viewControllerWithWindow:nil] presentViewController:YourVC animated:YES completion:nil];

还有一个值得注意的地方,在IOS13以后,用这种方式打开,会有一种层叠效果显示,这个时候我们需要在你的VC上设置一个属性

 YourVC.modalPresentationStyle = UIModalPresentationFullScreen;

这样效果就是全屏的了。

4.集成第三方SDK遇到的问题(IOS)

4.1 如何添加引用ios的其他第三方的插件,比如支付宝。

需要在podspec文件中添加,如

s.dependency 'SDWebImage','4.4.0'

4.2 如果是拷贝的第三方sdk的代码,图片资源没有被正常引用

有时候,我们需要将第三方提供的代码文件夹直接拷贝到我们的项目目录中,里面包括代码文件和资源文件。在操作过程中,项目跑起来以后,
发现界面上中的图片资源没正常显示出来,最后发现打包的包里面没有对应的图片资源。

这个时候我们需要将代码文件下面的图片资源手动拷贝到插件目录的Assets文件夹中。比如别人的图片资源可能是xxxx.bundle,我们只需要将
这个目录拷贝到该目录中即可,然后再podspec中添加引用

  s.resource_bundles = {
  'yourModelName' => ['Assets/yourModelName.bundle/*.png'],
  'yourModelName2' => ['Assets/yourModelName2.bundle/*.png'],
}

4.3 出现’OBJECT_METACLASS$_UTDIDPesistenFile’ 错误,(sdk冲突)

在这里插入图片描述

如上图,可以检查对应pod下面的sdk,如果有UTDID出现,首先检查是否有支付宝的sdk,如果有支付宝的sdk,则可以把支付宝的sdk替换成no-utdid的版本 https://opendocs.alipay.com/open/54/104509

在这里插入图片描述

这里有一个问题就是比如引用的是一个继承了支付宝sdk的插件,但是他没有使用no-utdid的sdk版本,这里有2种解决办法。

第一个是看有没有开源出来,可以手动下载修改,改成自己想要的版本

第二找到集成了支付宝的sdk插件的库,找到支付宝的sdk的目录,然后把no-utdid的版本本地替换掉原来的版本(经测试可行)

5.其他各种问题排查方法

1.如果发现插件项目修改了,但是引用的还是老的代码,这个时候可以先把插件项目给注释掉依次执行下面命令。

flutter clean
flutter pub get

如果一遍没效果,多执行几次,然后再去看看对应代码有没有更新


2.如果多人协同开发,请保持flutter版本一致。可以通过flutter --version 查看,最好的办法都更新到最新版本。


3.在Xcode种突然出现问题,原本可以正常运行的突然出现问题,依次执行下面命令

flutter clean (可以多执行几次)
flutter pub get
pod install

如果还是有异常问题,删除xcode缓存,如果是模拟器,删除模拟器缓存


4.莫名其妙的问题,本来还可以运行,突然就运行不了了。

新建项目,把现有的代码拷贝到新建的项目中。(已实践过,有效。哭~~~~~)

标签:坑记,插件,IOS,flutter,跳转,Flutter,sdk
来源: https://blog.csdn.net/xiaxiayige/article/details/115078747

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有