Flutter集成iOS原生遇到的问题汇总:

下面罗列一些最近在进行混编时遇到的一些问题:

Failed to register observatory port with mDNS with error -65555.

官方描述

On iOS 14 and higher, enable the Dart multicast DNS service in the Debug version of your app to add debugging functionalities such as hot-reload and DevTools via flutter attach.

处理办法

  • 将运用程序的Info.plist重命名为Info-Debug.plist。复制一个名为Info-Release.plist的副本,并将其增加到Xcode项目中

Flutter集成原生遇到的问题汇总

  • 在Info-Debug.plist中,增加键 Bonjour services 并将值设置为_dartobservatory._tcp

可选的设置Privacy - Local Network Usage Description,并将值设置为Allow Flutter tools on your computer to connect and debug your application.This prompt will not appear on release builds.

Flutter集成原生遇到的问题汇总

  • 在TARGETS中, build settings 修正Info.plist File途径 path/to/Info.plist 为 path/to/Info-$(CONFIGURATION).plist.

Flutter集成原生遇到的问题汇总

In iOS 14+,debug mode Flutter apps can only be launched from Flutter tooling,IDEs with Flutter pl…

Flutter集成原生遇到的问题汇总

剖析原因

在 iOS14 的真机上装置了 debug模式 编译出来的 flutter 运用,那么在断开编译装置连接后,将无法从桌面上翻开该运用程序

处理方案

  1. 运用flutter的release模式,终端输入
flutter run --release
  1. 修正main.dart的装备

Flutter集成原生遇到的问题汇总

Flutter集成原生遇到的问题汇总

Reason: tried: ‘/usr/lib/swift/App.framework/App’ (no such file), ‘/usr/lib/swift/App.framework/App’ (no such file),

剖析原因

FlutterApp.framework没有导入

处理办法

翻开Pods-xx-frameworks.sh,然后增加以下代码

install_framework "${PODS_ROOT}/../flutter/.ios/Flutter/App.framework"

可是这样只能一时处理问题,下次pod install后又没有这个装备了,终极处理办法是:

重装Cocoapods和ruby-macho:

卸载ruby-macho和Cocoapods
sudo gem uninstall ruby-macho
sudo gem uninstall cocoapods
重新装置ruby-macho和Cocoapods
sudo gem install ruby-macho
sudo gem install cocoapods

No podspec found for Flutter in ../flutter/.ios/Flutter/engine

剖析原因

这个是在这个途径下短少这个文件

处理办法

能够看下其他Flutter项目下,是否有这个文件直接复制过来,这个就是和Flutter引擎相关的文件。假如有ios文件夹,看下这个文件下有没有那个文件

Undefined symbol: OBJC_CLASS$_TestViewController

Flutter集成原生遇到的问题汇总

剖析原因

这个是我创立一个承继自FlutterViewController的类,没有发现

处理办法

在这个里边增加这个类的.m文件即可

Flutter集成原生遇到的问题汇总

底部Widget不跟从键盘弹起而弹起

剖析原因

默认resizeToAvoidBottomInset:true,Scaffold 内部会将 mediaQuery.viewInsets.bottom 参加到 BoxConstraints 的巨细计算,也就是键盘弹起时调整了内部的 bottom 位置来迎合键盘。

处理办法

设置 resizeToAvoidBottomInset: false

MissingPluginException(No implementation found for method resetPlugin on channel com.dooboolab.flutter_sound_player)

9.2.13版别以前,假如是iOS和Flutter混编项目,假如首次进入Flutter模块,这个插件运用是没有问题的,可是当离开这个模块第二次进入就会呈现注册插件犯错、初始化失利的状况。报错如下:

ERROR during registerWithRegistrar: flutterSoundPlayerManager != nil
MissingPluginException(No implementation found for method resetPlugin on channel com.dooboolab.flutter_sound_player)

剖析原因

这是第二次进入,注册失利,其他插件都能正常注册,后来提了问题给开发人员

处理办法

这是插件的确存在的bug,目前作者已经在最新版别9.2.13上做了修正。

后续再遇到新的问题,会持续更新的~

Could not build the precompiled application for the device. Error (Xcode): Undefined symbol: ___gxx_personality_v0

我单独在Xcode里边运行,发现是下面这个原因引起的,这个是在flutter里引入的录音插件 flutter_sound

Flutter集成原生遇到的问题汇总

剖析原因

最开端让我百思不解,后来我才想到是不是这个插件里边用到了C++

处理办法

Xcode中 Build Phases->link Binary with Libraries中增加libc++.tbd,这样就处理了这个问题

Flutter集成原生遇到的问题汇总

Unhandled Exception: PlatformException(channel-error, Unable to establish connection on channel., null, null)

处理办法

进行了项目混编,需求注册插件。

  • iOS在AppDelegate中didFinishLaunchingWithOptions办法里边调用 GeneratedPluginRegistrant.register(with: self)
  • Android增加 GeneratedPluginRegistrant.registerWith(flutterEngine)

Flutter装备抓包

需求手动装备IP

(_dio!.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
    (HttpClient client) {
  client.findProxy = (uri) {
    return "PROXY localhost:8888";
  };
  //这个是Android手机抓包需求装备的,不然验证证书一向失利
  client.badCertificateCallback =
      (cert, host, port) => true;
};

设置指示器的款式

SwiperCustomPagination(builder:
    (BuildContext context, SwiperPluginConfig config) {
  return Align(
    alignment: const Alignment(0, 0.85),
    child: Row(
      mainAxisAlignment: MainAxisAlignment.center,
      crossAxisAlignment: CrossAxisAlignment.center,
      children:
      controller.imageList
          .asMap()
          .keys
          .map((index) {
        return index == config.activeIndex
            ? Container(
          width: 16.0,
          height: 6.0,
          margin: const EdgeInsets.fromLTRB(
              3.0, 0, 3.0, 0),
          decoration: BoxDecoration(
              color: Colors.white,
              borderRadius: BorderRadius.circular(3)),
        )
            : Container(
          width: 6.0,
          height: 6.0,
          margin: const EdgeInsets.fromLTRB(
              3.0, 0, 3.0, 0),
          decoration: BoxDecoration(
              color: const Color(0x7FFFFFFF),
              borderRadius: BorderRadius.circular(3)),
        );
      }).toList(),
    ),
  );
})

完成作用

Flutter集成原生遇到的问题汇总

No application found for TargetPlatform.ios. Is your project missing an ios/Runner/Info.plist? Consider running “flutter create .” to create one.

剖析原因

项目代码中没有生成iOS工程文件

处理办法

在终端根据提示输入 flutter create . 即可自动生成iOS和Android工程代码。

ListView嵌套ListView,存在内容区域不显现

剖析原因

首要是由于内容短少了边界约束

处理办法

  • 运用Container包裹着子ListView,并且设置高度;
  • 修正ListView的shrinkWrap属性为True,由于True表示翻滚方向的翻滚视图内容是否应该由正在查看的内容所决议

集成百度地图插件时报错找不到头文件

Flutter集成原生遇到的问题汇总

处理办法

Xcode-TARGETS -> build settings -> Allow Non-modular Includes In Famework Modules设置为YES

设置文本的最大宽度

ConstrainedBox(
  constraints: const BoxConstraints(
    maxWidth: 100,
  ),
  child: const Text(
    '设置文本的最大宽度',
    overflow: TextOverflow.ellipsis,
    softWrap: true,
    style: TextStyle(
      fontSize: 20,
    ),
  ) ,
)

隐藏Flutter导航显现原生导航

让AppDelegate遵从UINavigationControllerDelegate

navigationController.delegate = self

完成署理办法

func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
  //假如是Flutter页面,导航栏就隐藏
  navigationController.navigationBar.isHidden = viewController.isKind(of: FlutterViewController.self)
 }

“extended_nested_scroll_view-master” is not a valid Dart package name.

剖析原因

这个是我在github上面拉的一个项目,想跑起来看下页面作用。直接报出了工程项目名不符合命名标准。

处理办法

项目名里边呈现了 - ,需求改为下划线 _

Flutter命名标准:

  • 文件名悉数小写,单词用下划线_分割;
  • 类名,大驼峰命名;
  • 变量名、办法名,小驼峰命名;
  • 私有变量需求加下划线;
  • Preferences -> Languages & Frameworks -> Flutter -> Editor,然后选中 选中Format code on save 和 Organize imports on save 。然后点击 OK 这样书写代码就会自动格式化了;

No application found for TargetPlatform.ios. Is your project missing an ios/Runner/Info.plist? Consider running “flutter create .” to create one.

在Android上面报这个过错 AndroidManifest.xml could not be found.

剖析原因

这个是项目短少ios和android目录

处理办法

当时项目下,运行 flutter create . 即可。

Flutter集成原生遇到的问题汇总

Failed assertion: line 269 pos 15: ‘padding == null || padding.isNonNegative’: is not true.

剖析原因

设置的 padding 参数有问题

设置文本的最大宽度

ConstrainedBox(
  constraints:BoxConstraints(
    maxWidth: 100,
  ),
  child:Text(
    "设置文本的最大宽度",
    overflow: TextOverflow.ellipsis,
    softWrap:true,
    style: TextStyle(
      fontSize: 20,
    ),
  ),
),

NetWork location failed because baidu location service check the key is unlegal, please check the key in AndroidManifest.xml !

剖析原因

这个是集成百度地图后Android端定位出的问题,这个首先要查看,定位权限是否开启,GPS定位开关是否翻开,假如都开启了,就要查看下百度开放平台的Android SHA1是否正确。

Xcode – TARGETS – build settings – Allow Non-modular Includes In Famework Modules 设置为 YES。

bottom overflowed by 10 PIXELS

剖析原因

这就是当咱们在一个固定巨细的Widget中布局时,内容显现不全时报的问题

处理办法

运用 SingleChildScrollView包裹要显现的内容,这样能够使得内容能够翻滚,就处理了这个问题。可是SingleChildScrollView 不支持根据Sliver的延迟实例化模型。所以假如内容超过显现区域太多时,不主张运用这个。

异步网络恳求完成后刷新UI

Future<String> fun1() async {
  return '1';
}
Future<String> fun2() async {
  return '2';
}
Future<String> fun3() async {
  return '3';
}
void test() {
  Future.wait([fun1(), fun2(), fun3()]).then((List responses) {
    print(responses);
  }).catchError((error) {
    print(error);
  });
}

Flutter 版别的操作

  • 查看当时Flutter版别:flutter –version
  • 查看展示装置信息:flutter doctor
  • 查看所有分支和当时分支:flutter channel
  • 切换到指定分支:flutter channel stable
  • 升级到最新版别:flutter upgrade
  • 升级到指定版别:flutter upgrade v3.0.1
  • 降级到指定版别:git reset –hard [commit_id]
  • 这个commit_id是在这儿找到的,首先翻开 github.com/flutter/flu…

Flutter集成原生遇到的问题汇总

Flutter集成原生遇到的问题汇总

以上是最近我做新项目遇到的问题,可是这个里边没有讲关于项目的架构设计、功用封装、插件选型这些。这儿仅仅记录在开发中遇到的问题,后续会把项目遇到的问题持续更新!!!