
大家好我是老刘Flutter 3.47发布了。每次大版本出来评论区问得最多的都是有啥新功能性能提升多少这次老刘想提醒你换个角度看。3.47里的好几项变化压根不算新功能更像一场搬家。Material搬家、渲染引擎换岗、iOS生命周期换规则。新功能决定你想不想升级搬家决定你不得不升级。今天老刘就带大家把Flutter 3.47里真正影响干活的要点盘点一遍哪些必须现在动手哪些可以再等等一次说清楚。一、核心要点速览官方Flutter 3.47博客 https://flutter.dev/blog/whats-new-in-flutter-3-47material_ui和cupertino_ui独立包发布 1.0设计系统与核心 SDK 正式解耦Impeller 桌面端默认启用macOS、Windows、Linux 全面切换到新一代渲染引擎为 Xcode 27 / iOS 27 / macOS 27 做准备最低系统版本要求提升Flutter Widget Previews 转正组件预览功能进入稳定版Wasm 默认化持续推进Web 应用向 WebAssembly 迁移一、Material、Cupertino正式分家3.44的时候老刘就说过官方要把Material和Cupertino从核心SDK里抽出来。当时还只是冻结代码这次是真搬出去了material_ui和cupertino_ui两个独立包在pub.dev上发布了1.0版本。分家图什么以前设计组件捆在SDK里改个按钮都得等Flutter发版。现在独立成包之后组件可以单独更新不用拖着整个SDK一起走社区贡献和修复能更快落地官方计划每周发版也为将来做一个风格中立的核心组件库铺了路怎么迁移官方给了一键迁移命令dart fix--apply--codemigrate_design_widgets它会自动把package:flutter/material.dart和package:flutter/cupertino.dart的导入换成新的独立包。这里有个坑要提一下迁移工具早期有个bug可能更新pubspec.yaml失败。真遇上了也别慌手动执行flutter pub add material_ui以及cupertino_ui再跑一遍dart fix --apply就行。依赖没跟上怎么办官方也想到了半迁移状态的问题提供了MaterialUiCompatibilityBridge。就算你的某些依赖还在用旧的核心SDK导入应用也能先切到独立包importpackage:material_ui/material_ui.dart;voidmain(){runApp(constMyApp());}classMyAppextendsStatelessWidget{constMyApp({super.key});overrideWidgetbuild(BuildContextcontext){returnMaterialApp(theme:ThemeData(colorScheme:ColorScheme.fromSeed(seedColor:constColor(0xFF6750A4)),),builder:(BuildContextcontext,Widget?child){returnMaterialUiCompatibilityBridge(child:child!);},home:constHomeScreen(),);}}本地化也跟着拆了flutter_localizations也被拆分Material和Cupertino的本地化委托分别移进了对应的包。迁移前importpackage:flutter_localizations/flutter_localizations.dart;importpackage:flutter/material.dart;localizationsDelegates:constLocalizationsDelegatedynamic[GlobalCupertinoLocalizations.delegate,GlobalMaterialLocalizations.delegate,GlobalWidgetsLocalizations.delegate,],迁移后importpackage:material_ui/material_ui.dart;localizationsDelegates:GlobalMaterialLocalizations.delegates,一行顶三行GlobalMaterialLocalizations.delegates会自动带上Cupertino和Widgets的委托反而更省事了。时间节点要记牢核心SDK里的旧设计库计划在11月的秋季稳定版正式弃用。如果你在维护生态插件请把这次迁移当成major release级别的变更来对待别等用户来催。老刘的看法3.44那会儿我担心过碎片化怕重演Android组件库分家后的乱象。这次看下来官方至少把功课做在前面了。上次我说迁移工具到时候都会配齐现在这话兑现了。真到动手那天AI加官方工具一起上手工修改这种费力不讨好的情况 基本就不存在了。二、Impeller桌面端全量默认这是本次更新里对桌面开发者影响最大的一项macOS、Windows、Linux三个桌面平台默认渲染引擎全部换成Impeller。Impeller是什么来头它是Flutter的下一代渲染引擎用来替代Skia。最大的卖点是把着色器编译挪到了构建期固定的着色器集提前编译好首次播动画时那种莫名其妙的掉帧shader compilation jank直接从根上消灭了。平台后端上macOS走MetalWindows和Linux走Vulkan。另外Impeller在桌面端用SDFSigned Distance Function渲染文字桌面文字和矢量曲线会比之前更清晰做桌面工具类应用的同学应该能直观感受到。想临时退回去也行万一你的项目在Impeller下出了问题三个平台都留了后门macOSInfo.plist里把FLTEnableImpeller设成falseWindowsmain.cpp里加project.set_impeller_switch(flutter::ImpellerSwitch::Disabled)Linuxmy_application.cc里调用fl_dart_project_set_enable_impeller(project, FALSE)注意这些回退选项未来会被移除。如果你的项目必须退回Skia才能跑请一定去给官方提bug这是你唯一的发声窗口。老刘的看法Impeller本质上是一套自渲染引擎直接指挥GPU画图。这条路的好处是界面在每个平台上完全一致没有中间桥接的性能损耗。原先我们说Flutter自带渲染引擎更多的是指flutter的framework但它并非真正的渲染层而是一个UI图形框架。真正的渲染这一步仍然是交给各个平台自己的渲染引擎比如skia。不同平台的底层还是会有差异。现在终于在这个层面也统一了。之前Impeller一直在移动端打磨这次敢在桌面三个平台全量默认说明官方对质量心里有底了。做桌面端的同学这个版本值得你认真实测一轮尤其是文字渲染和动画流畅度。三、Apple平台最低版本提升UIScene成必答题这一节是iOS开发者的重点也是全文最没有商量余地的一节。最低系统版本提升平台旧最低版本新最低版本Flutter 3.47iOS1315macOS10.1512iOS 13到14的用户这下真覆盖不到了发版前记得评估一下自己的用户分布。UIScene生命周期强制迁移iOS 27 SDK强制所有UIKit应用采用UIScene生命周期。用Xcode 27构建、又没适配UIScene的应用直接无法启动。好消息是大多数应用由Flutter CLI在构建时自动完成迁移。坏消息是如果你的AppDelegate里写过自定义原生代码或者用了依赖旧生命周期的插件这部分得手动处理。这事老刘从7月就开始念叨了当时叫它9月大限。现在3.47把工具链准备好了事情反而简单了只要你还要往App Store发版这道题就没有绕过去的选项只剩早做晚做的区别。四、Intel Mac退场SwiftPM冲刺收尾Intel Mac进入淘汰倒计时官方已经停止在Intel硬件上跑自动化测试了。在Intel主机上构建或者构建双架构包CLI会打印警告。未来某个版本警告会升级成错误。还在用Intel Mac当主力机的同学换机计划可以提上日程了。话说这是一个向老板要新电脑的绝佳理由。SwiftPM迁移进度92/100前100个iOS插件里已经有92个完成了Swift Package Manager迁移。CocoaPods正式进入维护模式没迁移的插件最终会无法工作。另外社区贡献者lukemmtt优化了构建管线提前过滤掉不必要的SwiftPM scheme构建速度有实打实的提升。老刘的看法之前老刘反复提醒过老项目别急着上AGP 9和SPM等生态跟上再说。现在情况开始变化了。Top 100插件的适配率到了92%CocoaPods进了维护模式方向已经定死剩下的只是时间问题。我的建议也跟着调整新项目直接上SwiftPM老项目现在就可以把插件清单拉出来过一遍看看哪些还没适配提前给作者提issue。真等到CocoaPods支持被移除那天再动手就被动了。五、Wasm继续推进Widget Previews转正Wasm默认化Flutter正在推动Web应用默认启用WebAssembly有个坑要提前说Wasm不支持旧的dart:html库得迁移到新的JS interop包package:web。好消息是升级项目依赖通常就能自动解决大部分遗留的interop问题。主渠道还上了一个实验性能力Wasm延迟加载。把Wasm应用拆成更小的懒加载模块优化首屏加载时间。做Web端的同学这个值得盯住首屏速度对web应用来说非常重要。Widget Previews转正Flutter Widget Preview正式进入稳定版。不用构建和启动整个应用就能即时渲染、检查。单个UI组件。稳定版带来三个改进启动更快本地项目缓存.widget_preview/文件夹消除重复设置的开销测试更灵活抽象出PreviewThemeDataAPI支持顺序主题分层复杂矩阵测试也好搞了Web资源自动同步预览Web组件时自动复制宿主项目的web/资源自定义主题和index.html都能自动应用这个功能对组件库作者和UI密集型企业项目是真福利改一个按钮再也不用等全量构建了。顺带提一句GenUI包也更新到了0.10.0新增a2ui_core包集中管理协议相关类还支持了A2UI客户端函数让agent可以指示客户端执行验证、派生值这类小任务省掉往返通信。AI生成UI这条线官方一直在悄悄加码。六、平台细节打磨快速过一遍这部分不展开挑重点列一下哪条戳中你的痛点你自己去翻changelog。Android修复了虚拟键盘修饰键比如Shift卡住的问题依赖版本矩阵Java最低17Kotlin Gradle Plugin 2.4.0Android Gradle Plugin 9.1.0Gradle 9.3.1标准API级别默认值flutter.compileSdkVersion和flutter.targetSdkVersion都是API 36flutter.minSdkVersion是API 24iOS / macOS代码签名更透明CLI选证书时会同时显示Team ID和Team Name签名失败时provisioning profile的错误信息更清晰了桌面修复Windows韩文输入时的光标定位问题Windows插件可通过FlutterEngine::PostPlatformThreadTask把耗时任务移出平台线程Linux新增触控笔旋转和压力报告框架打磨Android的高对比度和颜色反转设置现在能自动检测MediaQueryData.highContrast、MediaQueryData.invertColors移动端文本选择手柄在轻微滚动时保持稳定手柄不再遮挡屏幕顶部的上下文菜单修复SelectableRegion在空滚动容器中开始选择时的崩溃改进嵌入平台视图的原生iOS视图手势传播ImageIcon支持useOriginalColors: true保留原始颜色AnimatedCrossFade支持指定裁剪行为总结一下Flutter 3.47并非一个功能上重大更新的版本而是主要把之前的规划变成正式的路线。设计系统解耦、渲染引擎换代、Apple平台规则跟进这三件事单独拿出来都是大工程官方选择在一个版本里一起端上来。老刘的升级建议咱们的策略一直都没有改变新版本先观察两个月等核心功能稳定、第三方的生态跟上再开始升级。与其把时间花在给新版本填坑不如去关注你的业务逻辑。这次Flutter 3.47的更新你最关注哪一项Material分家你打算什么时候迁欢迎在评论区留言咱们聊聊。 如果看到这里的同学对客户端或者Flutter开发感兴趣欢迎联系老刘我们互相学习。 私信免费领老刘整理的《Flutter开发手册》覆盖90%应用开发场景。可以作为Flutter学习的知识地图。 : laoliu_dev 老刘也把自己历史文章整理在GitHub仓库里方便大家查阅。 https://github.com/lzt-code/blog