最后
说一千道一万,不如自己去行动。要想在移动互联网的下半场是自己占有一席之地,那就得从现在开始,从今天开始,马上严格要求自己,既重视业务实现能力,也重视基础和原理。基础夯实好了,高楼才能够平地而起,稳如泰山。
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
还有 高级架构技术进阶脑图、Android开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
==
Flutter推出来已经有一段时间了,前一阵Google IO大会后发布了Beta3。基于Flutter的 app可以一次编写,同时在Android和iOS平台上跑,并且能给用户带来完全原生的体验。我们都知道跨平台开发还有Hybrid,React Native以及Weex等方案,这些解决方案都是从Web开发的角度向Native开发演进,其技术基础都是HTML、CSS和Javascript等Web技术,对于没有接触过Web开发的Native app程序员来讲,门槛是比较高的。而Flutter给我的感觉是从Native开发向Web开发演进,Native app程序员应该能比较舒服的入门。
作为一名Android开发者,我始终认为跨平台是移动端开发的发展趋势,但是哪一种技术方案会最终胜出,还有待时间的检验。Flutter对Native开发者友好,并且吸纳了React等Web开发的前沿技术,可以作为Native程序员学习跨平台开发的很好的路径。
为了学习Flutter, 我试着开发了一个简单的新闻app,涵盖了一些移动端app比较基础的功能。接下来我会对照这个app来给大家介绍一下Flutter开发的一些知识。整个工程源码大家可以从Github获取。如有任何问题或建议,欢迎大家提issue。
本文是Android开发者的Flutter入门的第一部分,有一些技术细节放在了第二部分介绍,戳这里查看 Android开发者的Flutter入门(二)。
语言
==
Flutter是用Dart语言开发的。所以在开发Flutter app之前,需要我们对Dart语言有一定的掌握。对于Android程序员来讲,学习Dart是比较快的一个过程,和Java一样,Dart也是面向对象的语言。很多地方都是相通的。需要注意的是对于Dart里的类(各种构造函数,getter
,setter
),函数(函数也是对象,函数内部可以定义函数,函数可以作为参数和返回值, 闭包),以及异步(Future
,async
和await
)等地方要反复揣摩,仔细体会。
有了Dart的基础,那么我们就可以开始尝试开发个Flutter app了。
预备
==
首先你要配置Flutter的开发环境。对于我们Android程序员来讲,那就是再熟悉不过的Android Studio了。整个配置过程是比较简单的,大家照文档走就是了。不过要注意一点,如果你没有穿墙的的话,需要看一下这里。
开始
==
好了,环境已经弄好了,可能你已经把Hello World
也跑起来了。那么我们就用Flutter来开发一个稍微像样点的app吧。
我们开发的是一个简单新闻app。主要包含两个页面,一个首页,显示一个头条新闻的列表,点击里面的某个头条,就跳转到那条新闻的详情页面。这个简单的app包含了一些比较基础的功能:
如何通过网络从服务器请求数据?
Android程序员:我用OkHttp。
如何解析返回数据?
Android程序员:我用Gson。
返回的数据如何在界面上显示出来?
Android程序员:我用RecylerView。
如何显示网络图片?
Android程序员:我用Glide。
页面之间如何跳转?
Android程序员:我用Intent。
如何加入下拉刷新?
Android程序员:我用SwipeRefreshLayout。
接下来我们就说说以上这些功能如何在Flutter里实现,先来两张截图感受一下:
新闻列表
新闻源我们使用的是https://newsapi.org。你只要申请一个apiKey就能从他家获取json格式的头条新闻数据。至于详情的话需要用webview直接打开对应的新闻url。
网络返回的JSON数据格式如图所示:
这里面"articles"字段的值是个jsonArray,内容是头条新闻的列表。在Android中我们可以用Gson来把json数据反序列化为对象。那再Flutter中如何来做反序列化呢?
首先我们引入必要的库:
在pubspec.yaml加入以下内容
dependencies:
json_annotation: ^0.2.3
dev_dependencies:
build_runner: ^0.8.0
json_serializable: ^0.5.0
然后在终端中运行flutter packages get
(或者点击"Packages Get"的提示,类似你更改.gradle文件以后Android Studio显示的同步提示)
接下来就是model类了
import ‘package:json_annotation/json_annotation.dart’;
part “news.g.dart”;
@JsonSerializable()
class News extends Object with _$NewsSerializerMixin {
final String author;
final String title;
final String description;
final String url;
final String urlToImage;
final String publishedAt;
final Source source;
News(this.author,
this.title,
this.description,
this.url,
this.urlToImage,
this.publishedAt,
this.source);
factory News.fromJson(Map<String, dynamic> json) => _$NewsFromJson(json);
}
@JsonSerializable()
class Source extends Object with _$SourceSerializerMixin {
final String id;
final String name;
Source(this.id, this.name);
factory Source.fromJson(Map<String, dynamic> json) => _$SourceFromJson(json);
}
@JsonSerializable()
class NewsList extends Object with _$NewsListSerializerMixin {
final String status;
final int totalResults;
final List articles;
final code;
final message;
NewsList(this.status, this.totalResults, this.articles, this.code, this.message);
factory NewsList.fromJson(Map<String, dynamic> json) => _$NewsListFromJson(json);
}
看起来既有熟悉的字段,又有陌生的注解和代码?没关系,只要你按照这里的要求来做就行了。可以看出反序列化是在_$NewsListFromJson(json);
里完成的。那么这个函数从何而来呢?这需要我们运行命令flutter packages pub run build_runner build
来生成对应的代码。生成的代码存放在news.g.dart中。
至此model类以及反序列化我们就已经做完了,那么下面就看看网络请求怎么来实现。
网络请求
对应于Android中的OkHttp, Flutter中的网络请求库是http.dart。如下所示,代码比较简单
import ‘dart:async’;
import ‘dart:convert’;
import ‘package:flutter/foundation.dart’;
import ‘package:http/http.dart’ as http;
import ‘package:flutter_news/model/news.dart’;
class NewsApi {
static Future getHeadLines({String category: “general”, int page: 0}) async {
final response = await http.get(
“https://newsapi.org/v2/top-headlines?country=us&apiKey=efaf5fb66d104385ad40c73d4fd4acb1&page=KaTeX parse error: Expected 'EOF', got '&' at position 5: page&̲category=category”);
return compute(parseResult, response.body);
}
static NewsList parseResult(String respond) {
return NewsList.fromJson(json.decode(respond));
}
}
我们都知道在Android中网络请求需要在子线程来做,否则会阻塞主线程;请求的结果通过callback来返回给主线程。
而在Flutter中则更加简洁,通过async
和await
,避免了难看的callback代码嵌套。
函数getHeadLines
用来做http请求,在走到await
的时候会"等待"后面的http.get
函数执行完毕,返回值赋给response
,之后继续执行函数体中的后续代码。注意,这里的"等待"并不是阻塞在那里,而只是告诉系统,后续的代码需要在await
后面的表达式结束之后执行。你可以把await
那一行以下的代码理解为Android网络调用中的callback。实际的运行机制其实是比较复杂的,需要另写文章详细说明。
在请求得到返回值response
以后就要做json反序列化了。因为反序列化也有可能是个耗时任务,有可能会阻塞ui. 这里我们用过Flutter提供的compute
函数把反序列化放在另外的isolate
去完成。这里你可以先把isolate
当成是Java里的线程。compute
函数的第一个参数parseResult
是真正进行反序列化操作的函数。大家可以感受一下,函数作为参数还是比较方便的。
Model层我们已经有了,那么接下来就看下View层怎么来搭建吧。
界面
在做Android原生开发的时候。我们一般会用XML来搭建界面,里面是一个一个的View。而在Flutter中,和View等同的是Widget。Flutter app的界面就是由一个个Widget拼接起来的。而且Widget都是写在代码中的,目前没有用xml等其他搭建UI的方式,这也是目前Flutter开发被吐槽的点,代码中各种嵌套的Widget还是比较令人酸爽的。
结尾
最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。
高级UI,自定义View
UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。
不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
DnNG-1715815667141)]
高级UI,自定义View
UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。
不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!
[外链图片转存中…(img-ARsQd1RM-1715815667142)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!