解决方案一: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没啥变化,所以应该没啥问题。

6. ClampingScrollSimulation 的value中会返回Infinite

例如下面这段代码

ClampingScrollSimulation simulation;
AnimationController animationController;

simulation = ClampingScrollSimulation(
position: mTouch.dy,
velocity: details.velocity.pixelsPerSecond.dy,
tolerance: Tolerance.defaultTolerance,
);

animationController
…addListener(() {
currentState = STATE.STATE_ANIMATING;
canvasKey.currentContext.findRenderObject().markNeedsPaint();
/// 需要在这里判断一下数据是否有效的……
if (!animationController.value.isInfinite &&
!animationController.value.isNaN) {
currentAnimationPage.onTouchEvent(TouchEvent(
TouchEvent.ACTION_MOVE, Offset(0, animationController.value)));
}
})
…addStatusListener((status) {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

总结:

面试是一个不断学习、不断自我提升的过程,有机会还是出去面面,至少能想到查漏补缺效果,而且有些知识点,可能你自以为知道,但让你说,并不一定能说得很好。

有些东西有压力才有动力,而学到的知识点,都是钱(因为技术人员大部分情况是根据你的能力来定级、来发薪水的),技多不压身。

附上我的面试各大专题整理: 面试指南,满满的都是干货,希望对大家有帮助!

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

是干货,希望对大家有帮助!
[外链图片转存中…(img-u5C5Gg8X-1711929450262)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐