2024年安卓最新Flutter28,腾讯&字节&网易&华为Android面试题分享

更多Android高级工程师进阶学习资料

进阶学习视频

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

闪屏页

===

由于启动Flutter app的时候需要初始化Flutter。这个时间是比较长的。所以开发Flutter app的时候都需要加一个闪屏页。给Android平台上跑的Flutter app加闪屏页其实是和给一个正常的Android app加闪屏页是一样的。

首先在AndroidManifest.xml中,

在第一个红框中,给MainActivity设置了一个Theme; 另外注意一下第二个红框中的meta-data标签。那段注释的大概意思是说这个标签是用来表示让Flutter在启动过程中保持闪屏页直到第一帧画面被绘制出来。也就是说,闪屏页的隐藏不需要我们来处理了。

接下来看看这个LaunchTheme:

可见就定义了一个窗口的背景了,也就是我们的闪屏页本尊了,这里你可以把这个drawable改成你自己的闪屏页图片也OK。

至于ios平台的闪屏页怎么弄,可以参考这里

自定义布局

=====

我们都知道,在Android中,如果系统提供的布局控件不能满足我们的需求,我们会自定义布局控件来实现。Flutter同样的也提供自定义布局控件的功能。在这个新闻app中,首页的列表项显示效果如下图,这就是用自定义的布局控件来实现的。

这个列表项整个背景是新闻图片,然后在下方叠加标题和来源,文字部分会有个半透明的背景。

代码在news_item.dart中。

class NewsItem extends StatelessWidget {

@override

Widget build(BuildContext context) {

return new InkWell(

onTap: enabled ? onTap : null,

onLongPress: enabled ? onLongPress : null,

child: Semantics(

selected: selected,

enabled: enabled,

child: ConstrainedBox(

constraints: BoxConstraints(minHeight: 200.0, maxHeight: 200.0),

//这个是自定义Layout

child: CustomMultiChildLayout(

// 这个Delegate用来做实际的布局

delegate: ItemLayoutDelegate(),

//用来做布局的子控件们

children: children,

))),

);

}

}

CustomMultiChildLayout就是来让你做自定义布局的控件,需要一个Delegate做参数,这个Delegate需要我们自己实现。另一个参数children是需要布局的子控件。自定义布局控件的子控件们都需要用一个LayoutId的控件包起来。这也是Flutter一个比较有意思的地方,很多在Android中我们当做属性来用的东西,Flutter都会做成一个类来包裹,这也是造成UI代码比较难看的一个原因。

这里的id一般用枚举来表示,例如

enum _Block {

bg,

text,

}

bg代表新闻图片,text代表新闻标题。那么你传给CustomMultiChildLayout子控件列表需要是这样的,每一个都要用LayoutId包起来:

final List children = [];

children.add(LayoutId(

//头图的id

id: _Block.bg,

child: FadeInImage.assetNetwork(),

));

children.add(LayoutId(

// 标题的id

id: _Block.text,

child: Container()

));

最后我们在看看实际布局是怎么做的,来看ItemLayoutDelegate的代码:

class ItemLayoutDelegate extends MultiChildLayoutDelegate {

@override

void performLayout(Size size) {

if (hasChild(_Block.bg)) {

layoutChild(_Block.bg, new BoxConstraints.tight(size));

positionChild(_Block.bg, Offset.zero);

}

if (hasChild(_Block.text)) {

layoutChild(_Block.text,

new BoxConstraints.tight(Size(size.width, size.height * 0.4)));

positionChild(

_Block.text, new Offset(0.0, size.height - size.height * 0.4));

}

}

@override

bool shouldRelayout(MultiChildLayoutDelegate oldDelegate) => false;

}

自定义的布局是在performLayout这个函数中进行的。入参是个Size,也就是父控件的宽高。函数体就是根据id来取子控件,不同的子控件先调用layoutChild给约束,再调用positionChild摆位置,自定义布局就完成了,是不是很简单?

下拉刷新

====

添加一个Material design风格的下拉刷新比较简单,直接给列表包一个RefreshIndicator就可以了

return RefreshIndicator(

//触发的回调

onRefresh: _onRefresh,

child: ListView.builder()

)

下拉刷新触发的回调通过onRefresh参数设置。在_onRefesh里实现刷新数据的逻辑,需要注意的是函数_onRefresh需要返回Null类型的Future。在这个Future complete之后。刷新的图标会自己消失。效果如图:

上拉加载更多

======

Flutter没有系统提供的加载更过控件,这里我们想办法做一个比较粗糙的实现。思路是在列表的末尾添加一个加载控件,当滑动到列表底部的时候触发加载的操作。

ListView.builder(

//列表长度加1

itemCount: _articles.length + 1,

itemBuilder: (context, index) {

if (index == _articles.length) {

//如果是最后一个,返回加载更过控件

return LoadingFooter(

retry: () {

loadMore();

},

state: _footerStatus);

} else {

//返回正常列表项

学习交流

群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 28
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对于您提出的问,我可以回答。华为 OBS 存储是一种云存储服务,它可以为开发者提供预定义的标准对象存储服务,并可以实现数据的安全存储、复制、备份和恢复。它使用Flutter作为其开发平台,可以实现快速开发和部署,提高了开发者项目的效率。 ### 回答2: 华为obs存储是一种云存储服务,而flutter是一种跨平台的移动应用开发框架。华为obs存储和flutter可以结合使用,实现在移动应用中使用云存储功能。 使用flutter开发应用时,可以利用华为obs存储的API和SDK,实现文件上传、下载、管理等功能。开发者可以通过调用华为obs存储的接口,将移动应用中的文件传输到华为云的存储空间中,或者从华为云的存储空间中下载文件到应用中进行使用。 华为obs存储提供了稳定可靠的存储服务,具备高可用性和高扩展性,能够满足不同规模的应用需求。同时,华为obs存储还提供了数据加密、多副本备份等安全措施,保障数据的安全性和可靠性。 在使用flutter开发应用时,如果需要使用云存储功能,可以选择集成华为obs存储,通过华为obs存储的API进行文件的上传和下载操作,实现应用和云存储之间的数据传输。这样可以充分利用云存储的优势,提高应用的数据存储和传输效率,为用户提供更好的使用体验。 综上所述,华为obs存储和flutter可以很好地结合使用,实现移动应用中的云存储功能。开发者可以通过调用华为obs存储的接口,实现文件的上传、下载和管理等操作,提升应用的数据存储和传输效率,为用户提供更好的使用体验。 ### 回答3: 华为OBS存储是华为云提供的对象存储服务,而Flutter是由Google开发的跨平台移动应用开发框架。 华为OBS存储可以用于存储各种类型的数据,包括图片、视频、文档等。在Flutter开发中,我们可以利用华为OBS存储来上传、下载和管理这些数据。 首先,我们需要在华为云平台上创建一个OBS存储桶,用于存放我们的数据。然后,通过Flutter提供的网络请求库,我们可以使用华为OBS提供的API接口来实现文件的上传和下载。 在Flutter中,我们可以使用一些第三方库来简化与华为OBS存储的交互。例如,可以使用dio库来发送网络请求,通过设置请求头和参数来实现文件的上传和下载。我们可以使用华为OBS提供的Access Key和Secret Key来进行身份验证,并指定需要上传或下载的文件路径。 除了上传和下载,我们还可以利用华为OBS存储的其他功能。例如,可以通过Flutter应用程序与华为OBS存储进行通信,实时获取存储桶的状态信息,如获取当前存储桶中文件的列表、删除指定的文件等操作。 综上所述,华为OBS存储与Flutter的结合可以实现方便、高效的文件上传、下载及管理功能。通过利用华为OBS存储在移动应用开发中的优势,我们可以提供更好的用户体验和数据管理能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值