网易首页 > 网易号 > 正文 申请入驻

什么黑科技?实现Flutter跨平台屏幕适配

0
分享至


前言

采用flutter开发APP已经1年多了,平时开发的过程中踩过很多坑,今天想分享一个flutter应用跨平台适配的解决方案,目的是让你的flutter应用可以灵活高效的自动适配各种平台,实现UI最大化复用,业务逻辑代码在不同平台间能够共享。

下图描述了flutter-adapter的整体实现方案,我们在APP的入口处设置当前APP所运行的平台,这个平台可以在实际使用的时候动态设置,然后对于每个widget,我们只需要实现特定平台的样式适配即可。个别widget在不同平台的表现可能仅仅是部分属性的数值不同而已,对于属性值的垮平台适配我们提供了一个通用的函数superObjectAdapter去解决这个问题。

不同平台适配效果

手机竖屏

平板竖屏

平板横屏


使用方式

flutter_adapter插件内置了3类平台,分别是:手机(TEAdaptPlatform.phone)、pad横屏(TEAdaptPlatform.padLandscape)、pad竖屏(TEAdaptPlatform.padPortrait)。如果你只适配部分平台,那么只需要对待适配的widget实现特定平台的build函数即可,其他未适配的平台默认会返回Phone的样式。
使用的时候只需要在APP的入口处采用ScreenAdaptWidget,然后设置当前APP需要适配的平台名称即可。

如果你需要扩展适配的平台,对于StatelessWidget只需要实现一个继承自FlexibleStatelessWidget的抽象类,然后实现新平台的build函数并注册该平台即可;对于StatefulWidget只需要实现一个继承自FlexibleState的抽象类,然后实现新平台的build函数并注册该平台即可。

插件使用示例:

ScreenAdaptWidget(
platform: TEAdaptPlatform.phone.toString(),
child: 任意widget
)),

如果你的某个StatelessWidget需要适配特定平台,只需要将该widget继承自FlexibleStatelessWidget,然后实现特定平台的build函数即可。

StatelessWidget适配示例: class MyStatelessPage extends FlexibleStatelessWidget {
@override
Widget buildPhone(BuildContext context) {
return Text('Phone',style: TextStyle(fontSize: 18.0),);
}
@override
Widget buildPadPortrait(BuildContext context) {
return Text('PadPortrait',style: TextStyle(fontSize: 22.0),);
}
@override
Widget buildPadLandscape(BuildContext context) {
return Text('PadLandscape',style: TextStyle(fontSize: 30.0),);
}
StatefulWidget适配示例:

如果你的某个StatefulWidget需要适配特定平台,只需要将该StatefulWidget对应的的State继承自FlexibleState,然后实现特定平台的build函数即可,例如:

class MyStatefulPageState extends FlexibleState<MyStatefulPage> {
@override
Widget buildPhone(BuildContext context) {
return Text('Phone',style: TextStyle(fontSize: 18.0),);
}
@override
Widget buildPadPortrait(BuildContext context) {
return Text('PadPortrait',style: TextStyle(fontSize: 22.0),);
}
@override
Widget buildPadLandscape(BuildContext context) {
return Text('PadLandscape',style: TextStyle(fontSize: 30.0),);
}
}
普通Widget适配示例:

如果你的某个widget仅仅需要在不同平台中改变个别属性的值,那么只需要对特定的属性值进行跨平台适配即可,flutter_adapter提供了superObjectAdapter函数来解决属性值的跨平台适配难题。

class MyNormalPage extends StatelessWidget {
final String textStr;
MyNormalPage(this.textStr);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('page normal'),
),
body: Column(
children: <Widget>[
Container(
padding: EdgeInsets.all(10.0),
margin: EdgeInsets.only(bottom: 30.0),
width: double.infinity,
height: 100.0,
color: superObjectAdapter(context, {TEAdaptPlatform.phone.toString(): Colors.yellow, TEAdaptPlatform.padPortrait.toString(): Colors.greenAccent}),
child: Center(
child: Text(
'\$textStr \${superObjectAdapter(context, {
TEAdaptPlatform.phone.toString(): "[Phone]",
TEAdaptPlatform.padPortrait.toString(): "[PadPortrait]"
})}',
style: TextStyle(
fontSize: superObjectAdapter(context, {TEAdaptPlatform.phone.toString(): 18.0, TEAdaptPlatform.padPortrait.toString(): 38.0}),
color: Colors.black),
),
),
),
],
),
);
}
}

属性跨平台适配-手机

属性跨平台适配-平板

扩展需要适配的平台

插件内置的3个平台在实际使用的过程中可能不够用,因此我们提供了用户自定义平台的适配解决方案。

StatelessWidget适配新平台:

对于StatelessWidget只需要实现一个继承自FlexibleStatelessWidget的抽象类,然后实现新平台的build函数,之后注册该平台即可。

abstract class CustomFlexibleStatelessWidget extends FlexibleStatelessWidget {
@protected
Widget buildNewPlatform(BuildContext context) {
return buildPhone(context); // by default, you can return the phone's style
}
@protected
void initAdapter() {
super.initAdapter();
addAdapter(Constant.newPlatform, buildNewPlatform);// register new Platform
}
}

StatelessWidget适配新平台示例:


class MyStatelessPage extends CustomFlexibleStatelessWidget {
@override
Widget buildPhone(BuildContext context) {
return Text('Phone',style: TextStyle(fontSize: 18.0),);
}
@override
Widget buildPadPortrait(BuildContext context) {
return Text('PadPortrait',style: TextStyle(fontSize: 22.0),);
}
@override
Widget buildNewPlatform(BuildContext context) {
return Text('buildNewPlatform',style: TextStyle(fontSize: 30.0),);
}
}

StatefulWidget适配新平台:

对于StatefulWidget只需要实现一个继承自FlexibleState的抽象类,然后实现新平台的build函数,之后注册该平台即可。

abstract class CustomFlexibleState<T extends StatefulWidget> extends FlexibleState<T> {
@protected
Widget buildNewPlatform(BuildContext context) {
return buildPhone(context); // by default, you can return the phone's style
}
@protected
void initAdapter() {
super.initAdapter();
addAdapter(Constant.newPlatform, buildNewPlatform);// register new Platform
}
}

StatefulWidget适配新平台示例: class MyStatefulPageState extends CustomFlexibleState<MyStatefulPage> {
@override
Widget buildPhone(BuildContext context) {
return Text('Phone',style: TextStyle(fontSize: 18.0),);
}
@override
Widget buildPadPortrait(BuildContext context) {
return Text('PadPortrait',style: TextStyle(fontSize: 22.0),);
}
@override
Widget buildNewPlatform(BuildContext context) {
return Text('NewPlatform',style: TextStyle(fontSize: 30.0),);
}
}

用户自定义平台

本项目已经开源,开源地址: Flutter-adapter(https://github.com/buaashuai/flutter_adapter)

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
前女友缅怀张雪峰,呼吁大家嘴下留德,曾自曝遭家暴污蔑才分手!

前女友缅怀张雪峰,呼吁大家嘴下留德,曾自曝遭家暴污蔑才分手!

古希腊掌管松饼的神
2026-03-25 15:38:23
张雪峰的财产几个亿,竟然没买车,天天吃外卖,生活简朴到极致

张雪峰的财产几个亿,竟然没买车,天天吃外卖,生活简朴到极致

魔都姐姐杂谈
2026-03-25 15:59:12
曝张雪峰在苏州举办葬礼,生前最后一次直播,趴桌子上身体已不适

曝张雪峰在苏州举办葬礼,生前最后一次直播,趴桌子上身体已不适

180视角
2026-03-25 16:58:57
富士康崩得太突然!郭台铭绝对没料到,

富士康崩得太突然!郭台铭绝对没料到,

南权先生
2026-03-25 15:26:55
张雪峰登上这份死亡名单,他们有一个很玄的共同特点

张雪峰登上这份死亡名单,他们有一个很玄的共同特点

田先生研究室
2026-03-25 06:05:11
速效救心丸立大功!医生发现:老人吃速效救心丸,能缓解4种症状

速效救心丸立大功!医生发现:老人吃速效救心丸,能缓解4种症状

医学原创故事会
2026-03-25 00:06:45
一场涉及近68万亿的债务脱钩行动,已经进入最后15个月的倒计时

一场涉及近68万亿的债务脱钩行动,已经进入最后15个月的倒计时

流苏晚晴
2026-03-24 19:20:03
特朗普称已向伊朗提出和平方案,中方回应

特朗普称已向伊朗提出和平方案,中方回应

中国网
2026-03-25 16:04:21
外交部发言人反问日媒:“你见过有人未经允许持刀进入使馆与大使交谈的先例吗?”

外交部发言人反问日媒:“你见过有人未经允许持刀进入使馆与大使交谈的先例吗?”

环球网资讯
2026-03-25 15:39:26
国务院令!3月30日起全国施行,土葬合法,殡葬业暴利彻底凉凉!

国务院令!3月30日起全国施行,土葬合法,殡葬业暴利彻底凉凉!

今朝牛马
2026-03-24 22:13:12
张雪峰的病,速效救心丸能救吗?

张雪峰的病,速效救心丸能救吗?

中国新闻周刊
2026-03-25 16:23:30
张雪峰经典名言 100 条(完整版)

张雪峰经典名言 100 条(完整版)

新浪财经
2026-03-25 06:17:25
悲催!怎么会这么巧?张雪峰和曝光眼镜暴利的记者,都是心脏骤停

悲催!怎么会这么巧?张雪峰和曝光眼镜暴利的记者,都是心脏骤停

火山詩话
2026-03-24 18:23:32
张雪峰6年前已离婚,独女张姩菡只能分16.5%遗产,现任妻子占大头

张雪峰6年前已离婚,独女张姩菡只能分16.5%遗产,现任妻子占大头

枫红染山径
2026-03-25 16:56:22
伊朗愿意与“主和派”万斯谈!特朗普一边宣称胜利一边增兵中东:我和鲁比奥也要参与

伊朗愿意与“主和派”万斯谈!特朗普一边宣称胜利一边增兵中东:我和鲁比奥也要参与

红星新闻
2026-03-25 17:17:14
让快乐加倍——或是奇瑞QQ回归的最大意义

让快乐加倍——或是奇瑞QQ回归的最大意义

汽车有智慧
2026-02-12 16:24:20
送检4个LV包均为假!消费者:都是在专柜买的,LV专柜回应

送检4个LV包均为假!消费者:都是在专柜买的,LV专柜回应

福建第一帮帮团
2026-03-24 19:32:34
“中园石化”被立案调查

“中园石化”被立案调查

每日经济新闻
2026-03-25 11:13:18
原来她是张雪峰前妻,90后历史学博士‌,两人离婚后曾一起上节目

原来她是张雪峰前妻,90后历史学博士‌,两人离婚后曾一起上节目

大铁猫娱乐
2026-03-25 13:03:57
日本士兵闯入中国使馆,意图刺杀中国大使。高市:降级中日关系

日本士兵闯入中国使馆,意图刺杀中国大使。高市:降级中日关系

清欢百味
2026-03-25 06:26:23
2026-03-25 19:23:00
小诸侯
小诸侯
整理最搞笑的GIf
41文章数 0关注度
往期回顾 全部

科技要闻

红极一时却草草收场,Sora宣布正式关停

头条要闻

伊朗放话愿意与"主和派"万斯谈 特朗普表态

头条要闻

伊朗放话愿意与"主和派"万斯谈 特朗普表态

体育要闻

35岁替补门将,凭什么入选英格兰队?

娱乐要闻

张雪峰经抢救无效不幸去世 年仅41岁

财经要闻

管涛:中东局势如何影响人民币汇率走势?

汽车要闻

智己LS8放大招 30万内8系旗舰+全线控底盘秀实力

态度原创

数码
教育
家居
手机
军事航空

数码要闻

小米首款追踪器!小米Tag UWB防丢器图赏

教育要闻

燕尾模型秒解三角形面积,数学题不再难!

家居要闻

轻奢堇天府 小资情调

手机要闻

苹果发布iOS/iPadOS 26.4:新增8个Emoji、Apple Music增强,Gemini驱动Siri仍需等待

军事要闻

伊朗重申非交战国家船只可安全通过霍尔木兹海峡

无障碍浏览 进入关怀版