【个人笔记】Flutter很好用,android面试宝典2024

按照官方文档,大量计算东西应该放到Isolate中,所以,自然而然地,我们将textPinter测绘方法放到Isolate中执行,但是呢,执行报错:native function not found

原因就是UI包的类只允许在Flutter的UI Isolate中执行。

_此题无解,完结撒花,各回各家,各找各妈_(才怪)

解决方案一:Plugin

这个方法的思路来自于官方开发人员的回答:

right now you would have to write your own line-breaking logic - perhaps as a plugin. We don’t currently have any API for doing text layout in a separate isolate. @GaryQian might have some other idea about this too.

所以说,我们看下官方的Plugin是怎么实现的。

在 Plugin工程中,有这么一个: android_alarm_manager ,这个Plugin中的AlarmService.java文件中,有这么一个方法:startBackgroundIsolate(要素察觉+1)

通过阅读源码,我们得知,其实说白了就是新建一个FlutterNativeView ,这个FlutterNativeView 不负责渲染界面,只负责当后台线程来用。同样的道理,我们也可以用同样的方法来处理我们的需要运行在UI Isolate的异步任务。(至于为什么新建一个FlutterNativeView ,就能实现这个需求,粗略的说下是因为,每次新建FlutterNativeView,其实都会新建一些TaskRunner,其中就包含UI 的TaskRunner,总之有兴趣的可以搜下Flutter中的TaskRunner机制了解下)

不过,其实不用自己实现注册,有这么一个第三方:flutter_isolate可以做到这点,用法跟普通的isolate差不多,所以解决方式也很简单:找到原来使用Isolate的那段代码,把Isolate.spawn替换为FlutterIsolate.spawn即可。不过经过测试,在1.10版本上会报错,所以想使用这个方式的话,还是切回stable 分支使用吧。

解决方案二:分割为多个小任务(个人感觉不太推荐这种方式,感觉不可控,毕竟假如小任务的执行时间也很长咋办)

这种方式说白了就是每测绘完一行,就提交一次,而不是整体测绘完之后再提交结果。

举个小例子:

Future(() async {
var result;
for (var i = 0; i < 1000000; ++i) {
result = ‘result is $i’;
await Future.delayed(Duration.zero);
}
print(result);
});

用这种方式计算就不会卡UI

解决方案三:目前这个问题已经加入到里程碑了,在未来的某天应该就有解决方案

github.com/flutter/flu…

2. Flutter IOS 后台音频播放

也就是像音乐播放器那样,会有个通知显示进度,即使在桌面也可以播放音乐这种

目前只有Android的实现,IOS这块目前还没有方案……%

3. Flutter 中 NestedScrollView 中存在折叠头、子列表等情况下的滑动等异常

找了半天才发现有个大佬已经搞定了这个问题:

juejin.im/post/684490…

使用extended_nested_scroll_view即可解决这个问题,在此记录一下

4. Hero 跳转之后的图片如果在折叠布局中被折叠隐藏了,那么Hero的退出动画无法正常播放,并且原图片无法显示

这个描述可能有些抽象,具体情况以一个例子为例描述:

一、首页放一个图片,给他设置点击跳转详情页,并设置hero动画。

二、将图片设置为SliverAppBar的FlexibleSpaceBar的widget中的内容,然后上拉页面,折叠隐藏掉SliverAppBar。

三、按后退键退出详情页,触发hero的关闭动画。

按这三步执行之后,首页原来那张图片就变成空白,而且无法点击。

issue:

github.com/flutter/flu…

github.com/flutter/flu…

所以切换到master分支或者dev分支(问题修复版本v.1.10.14),或者降低稳定版的版本。

5. listView 不支持按index跳转

下面是我搜索出的内容:

stackoverflow.com/questions/5…

pub.dev/packages/in…

pub.dev/packages/sc…

pub.dev/packages/fl…

上面的实现方法各有千秋吧,整理一下主要的缺陷点,以后可以根据实际情况使用:

  1. stackOverflow 中提到了两种方法:一是使用index_list_view,这个稍后统一分析。二是 gist.github.com/debuggerx01… ,不过有老哥将它放在带评论的列表上,结果性能比较差,简介文章中也讲明了,如果处理不好确实可能存在性能问题。
  2. indexed_list_view stackOverflow中也提了,这个适用于无限列表的情况。
  3. scroll_to_index 代码稍微有点侵入性(其实这个不是重点),其次没有jump方法,scroll时长好像也没什么效果,所以如果列表比较大而跳转距离也很大(比如说凡人修仙传的章节那种……),那么动画效果比较感人。(PS:好像这个滑动时间长的问题(github.com/flutter/flu…)已经修复了,虽然在这个issue中没有说,但是我自己在v1.10.14上发现好像现在scroll动画能在很短时间内滑动到目标位置了)
  4. flutter_widgets 谷歌大大的产品(不过不是官方正式控件),基本满足需求,方法也很简单,jump方法的什么也有。但是,如果把它放到NestScrollView中搞视差滑动的页面的时候,会导致整体无法滑动,只能滑动ScrollablePositionedList中的内容……(其实原因就是因为自定义了controller),而且如果存在ExpansionTile这种可伸缩的布局,通过伸缩方式改变了item的高度,ScrollablePositionedList并不会更新高度,而是还是以改变前高度为准进行index跳转。

现在正在尝试解决ScrollablePositionedList中的视差滑动问题,(得想个办法让NestScrollView届的到ScrollablePositionedList的controller) 在NestScrollView中是通过设置PrimaryScrollController,让innerController管理body滑动的,所以使用这个innerController来替代ScrollablePositionedList的controller即可解决无法滑动的问题,但是随之而来的是一个新的问题,现在按index跳转,会导致body触发滑动,进而直接折叠掉SliverAppBar……………如何让index跳转的时候,body在NestScrollView中的位置不动,只在原地实现自身的index跳转,只有手动滑动的时候才允许改变body在NestScrollView中的位置,目前想法是在SliverAppBar的floating、pinned等控制滑动方式的方法上看看有没有突破口。 不搞了,现在挺好的。直接满屏展示,实在不行加个跳转到顶部按钮,我感觉蛮合理的。(大雾)

改变高度这个,目前采用设置addPersistentFrameCallback 方式持续监听。本以为应该性能比较差,但是测试了一下,好像frame没啥变化,所以应该没啥问题。

最后

下面是辛苦给大家整理的学习路线,有需要的可以点击这里免费获取

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频**
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-KGilSQ9o-1710989056897)]

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值