4、图片高斯模糊
在 Flutter 中,提供了 BackdropFilter
和 ImageFilter
实现了高斯模糊的支持,如下代码所示,可以快速实现上图的高斯模糊效果。
class BlurDemoPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: new Container(
child: Stack(
children: [
Positioned(
top: 0,
bottom: 0,
left: 0,
right: 0,
child: new Image.asset(
“static/gsy_cat.png”,
fit: BoxFit.cover,
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
)),
new Center(
child: new Container(
width: 200,
height: 200,
child: ClipRRect(
borderRadius: BorderRadius.circular(15.0),
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 8.0, sigmaY: 8.0),
child: new Row(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
new Icon(Icons.ac_unit),
new Text(“哇!!”)
],
)))))
],
)));
}
}
5、滚动到指定位置
因为目前 Flutter 并没有直接提供滚动到指定 Item
的方法,在每个 Item
大小不一的情况下,折中利用如图下所示代码,可以快速实现滚动到指定 Item
的效果:
上图为部分代码,完整代码可见 scroll_to_index_demo_page2.dart ,这里主要是给每个 item
都赋予了一个 GlobalKey
, 利用 findRenderObject
找到所需 item
的 RenderBox
,然后使用 localToGlobal
获取 item
在 ViewPort
这个 ancestor
中的偏移量进行滚动:
当然还有另外一种实现方式,具体可见 scroll_to_index_demo_page.dart
6、findRenderObject
在 Flutter 中是存在 容器 Widget 和 渲染Widget 的区别的,一般情况下:
Text
、Sliver
、ListTile
等都是属于渲染 Widget ,其内部主要是RenderObjectElement
。StatelessWidget
/StatefulWidget
等属于容器 Widget ,其内部使用的是ComponentElement
,ComponentElement
本身是不存在RenderObject
的。
结合前面篇章我们说过 BuildContext
的实现就是 Element
,所以 context.findRenderObject()
这个操作其实就是 Element
的 findRenderObject()
。
那么如上图所示,findRenderObject
的实现最终就是获取 renderObject
,在 Element
中 renderObject
的获取逻辑就很清晰了,在遇到 ComponentElement
时,执行的是 element.visitChildren(visit);
, 递归直到找到 RenderObjectElement
。
所以如下代码所示,print("${globalKey.currentContext.findRenderObject()}");
最终输出了 SizedBox
的 RenderObject
。
7、行间距
在 Flutter 中,是没有直接设置 Text
行间距的方法的, Text
显示的效果是如下图所示的逻辑组成:
那么我们应该如何处理行间距呢?如下图所示,通过设置 StrutStyle
的 leading
, 然后利用 Transform
做计算翻方向位置偏移,因为 leading
是上下均衡的,所以计算后就可以得到我们所需要的行间距大小。 (虽然无法保证一定 100%像素准确,你是否还知道其他方法?)
这里额外提一点,可以通过父节点使用
DefaultTextStyle
来实现局部样式的共享哦。
8、Builder
在 Flutter 中存在 Builder
这样一个 Widget,看源码发现它其实就是 StatelessWidget
的简单封装,那为什么还需要它的存在呢?
如下图所示,相信一些 Flutter 开发者在使用 Scaffold.of(context).showSnackBar(snackbar)
时,可能 遇到过如下错误,这是因为传入的 context
属于错误节点导致的,因为此处传入的 context
并不能找到页面所在的 Scaffold
节点。
所以这时候 Builder
的作用就体现了,如下所示,通过 builder
方法返回赋予的 context
,在向上查找 Scaffold
的时候,就可以顺利找到父节点的 Scaffold
了,这也一定程度上体现了 ComponentElement
的作用之一。
9、快速实现动画切换效果
要实现如上图所示动画效果,在 Flutter 中提供了 AnimatedSwitcher
封装简易实现。
如下图所示,通过嵌套 AnimatedSwitcher
,指定 transitionBuilder
动画效果,然后在数据改变时,同时改变需要执行动画的 key
值,即可达到动画切换的效果。
10、多语言显示异常
在官方的 github.com/flutter/flu… issue 中可以发现,Flutter 在韩语/日语 与中文同时显示,会导致 iOS 下出现文字渲染异常的问题 ,如下图所示,左边为异常情况。
改问题解决方案暂时有两种:
-
增加字体 ttf ,全局指定改字体显示。
-
修改主题下所有
TextTheme
的fontFamilyFallback
:
getThemeData() {
var themeData = ThemeData(
primarySwatch: primarySwatch
);
var result = themeData.copyWith(
textTheme: confirmTextTheme(themeData.textTheme),
accentTextTheme: confirmTextTheme(themeData.accentTextTheme),
primaryTextTheme: confirmTextTheme(themeData.primaryTextTheme),
);
return result;
}
/// 处理 ios 上,同页面出现韩文和简体中文,导致的显示字体异常
confirmTextTheme(TextTheme textTheme) {
getCopyTextStyle(TextStyle textStyle) {
return textStyle.copyWith(fontFamilyFallback: [“PingFang SC”, “Heiti SC”]);
}
return textTheme.copyWith(
display4: getCopyTextStyle(textTheme.display4),
display3: getCopyTextStyle(textTheme.display3),
display2: getCopyTextStyle(textTheme.display2),
display1: getCopyTextStyle(textTheme.display1),
headline: getCopyTextStyle(textTheme.headline),
title: getCopyTextStyle(textTheme.title),
subhead: getCopyTextStyle(textTheme.subhead),
body2: getCopyTextStyle(textTheme.body2),
body1: getCopyTextStyle(textTheme.body1),
caption: getCopyTextStyle(textTheme.caption),
button: getCopyTextStyle(textTheme.button),
subtitle: getCopyTextStyle(textTheme.subtitle),
overline: getCopyTextStyle(textTheme.overline),
);
}
ps :通过
WidgetsBinding.instance.window.locale;
可以获取到手机平台本身的当前语言情况,不需要context
,也不是你设置后的Locale
。
11、长按输入框导致异常的情况
如果项目存在多语言和主题切换的场景,可能会遇到长按输入框导致异常的场景,目前可推荐两种解放方法:
- 1、可以给你的自定义
ThemeData
强制指定固定一个平台,但是该方式会导致平台复制粘贴弹出框没有了平台特性:
///防止输入框长按崩溃问题
platform: TargetPlatform.android
- 2、增加一个自定义的
LocalizationsDelegate
, 实现多语言环境下的自定义支持:
class FallbackCupertinoLocalisationsDelegate
extends LocalizationsDelegate {
const FallbackCupertinoLocalisationsDelegate();
@override
bool isSupported(Locale locale) => true;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
题外话
不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊~
这里我为大家准备了一些我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,点击这里免费分享给大家,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~
最后如果马化腾把腾讯给你一天,你会来做什么?欢迎评论区讨论。
以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,点击这里免费分享给大家,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~
[外链图片转存中…(img-0LeDEmqD-1711183113608)]
最后如果马化腾把腾讯给你一天,你会来做什么?欢迎评论区讨论。