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项目中
- 在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.
- 在TARGETS中, build settings 修正Info.plist File途径 path/to/Info.plist 为
path/to/Info-$(CONFIGURATION).plist
.
In iOS 14+,debug mode Flutter apps can only be launched from Flutter tooling,IDEs with Flutter pl…
剖析原因
在 iOS14 的真机上装置了 debug模式 编译出来的 flutter 运用,那么在断开编译装置连接后,将无法从桌面上翻开该运用程序
处理方案
- 运用flutter的release模式,终端输入
flutter run --release
- 修正main.dart的装备
Reason: tried: ‘/usr/lib/swift/App.framework/App’ (no such file), ‘/usr/lib/swift/App.framework/App’ (no such file),
剖析原因
Flutter
的App.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
剖析原因
这个是我创立一个承继自FlutterViewController的类,没有发现
处理办法
在这个里边增加这个类的.m文件即可
底部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
剖析原因
最开端让我百思不解,后来我才想到是不是这个插件里边用到了C++
处理办法
Xcode中 Build Phases->link Binary with Libraries中增加libc++.tbd
,这样就处理了这个问题
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(),
),
);
})
完成作用
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表示翻滚方向的翻滚视图内容是否应该由正在查看的内容所决议
集成百度地图插件时报错找不到头文件
处理办法
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 .
即可。
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…
以上是最近我做新项目遇到的问题,可是这个里边没有讲关于项目的架构设计、功用封装、插件选型这些。这儿仅仅记录在开发中遇到的问题,后续会把项目遇到的问题持续更新!!!