安卓的面试题,腾讯T3团队实力打造flutter入门教程(1),看这篇足矣了

// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: ‘Flutter Demo’,
home: MyHomePage(),
);
}
}

class MyHomePage extends StatelessWidget{
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(“我是Title”),
),
body: Center(
child: Text(
‘Hello World’,
)
)
);
}
}

在上面的代码中,可以清楚看到,最简单的页面的层级关系:

MaterialApp -> MyHomePage -> Scaffold -> body -> Center -> Text

**Scaffold是啥?**他是Flutter的页面脚手架,你可以当HTML页面一样去理解,不同的是,他除了Body以外,还提供appBar顶部TitleBar、bottomNavigationBar底部导航栏等属性。

显示效果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是最简单的页面,没有交互,只有显示,但是实际业务场景中,是不太可能都是这种页面的,页面上的数据一般都是来自接口返回,然后再在页面上进行动态的渲染。 此时,就需要使用使用带状态的StatefulWidget了

5.6 给页面加上状态

给自己一个需求,按钮点击时,修改页面上显示的文字“Hello World” 变成“You Click Me”

import ‘package:flutter/material.dart’;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: ‘Flutter Demo’,
home: MyHomePage(),
);
}
}

class MyHomePage extends StatefulWidget{
@override
MyHomePageState createState() => MyHomePageState();
}

class MyHomePageState extends State{
var msg=“Hello World”; //msg默认文字
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(“我是Title”),
),
body: Center(
child:Column(
children:[
Text(msg), //根据变量值,显示文字
FlatButton(
color: Colors.blue,
textColor: Colors.white,
//点击按钮,修改msg的文字
onPressed: () {
setState(() {
this.msg=“You Click ME”;
});
},
child: Text(
“Click ME”,
style: TextStyle(fontSize: 20.0),
),
)
]
)
)
);
}

}

执行效果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面最关键的一段代码就是这个:

onPressed: () {
setState(() {
this.msg=“You Click ME”;
});
},

相信写过小程序的同学,对这个 setState 还是很眼熟的 _

5.7 小结一下

StatelessWidget:无状态变更,UI静态固化的Widget, 页面渲染性能更高。
StatefulWidget:因状态变更可以导致UI变更的的Widget,涉及到数据渲染场景,都使用StatefulWidget。

为啥要分两个? StatelessWidget拥有的功能,StatefulWidget都有了啊?

答案只有一个:性能、性能、性能

在StatefulWidget里,因为要维护状态,他的生命周期比StatelessWidget更复杂,每次执行setState,都会触发
window.scheduleFrame() 导致整个页面的widget被刷新,性能就会降低。

使用过小程序的同学在这点上应该有体会,在小程序的官方文档中,会强烈建议减少setData的使用频率,以避免性能的下降。 只不过flutter更是激进,推出了StatelessWidget,并直接在该Widget里砍掉了setState的使用。

页面结构关系如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

6.路由

实际的项目,是有多个不同的页面的,页面之间的跳转,就要用到路由了。 我们增加一个list页面,点击Home页的“Click Me”按钮,跳转到列表页list。

6.1 单个页面的跳转

增加list.dart

import ‘package:flutter/material.dart’;

class ListPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
//定义列表widget的list
List list=[];

//Demo数据定义
var data=[
{“id”:1,“title”:“测试数据AAA”,“subtitle”:“ASDFASDFASDF”},
{“id”:2,“title”:“测试数据bbb”,“subtitle”:“ASDFASDFASDF”},
{“id”:3,“title”:“测试数据ccc”,“subtitle”:“ASDFASDFASDF”},
{“id”:4,“title”:“测试数据eee”,“subtitle”:“ASDFASDFASDF”},
];

//根据Demo数据,构造列表ListTile组件list
for (var item in data) {
print(item[“title”]);

list.add( ListTile(
title: Text(item[“title”],style: TextStyle(fontSize: 18.0) ),
subtitle: Text(item[“subtitle”]),
leading: Icon( Icons.fastfood, color:Colors.orange ),
trailing: Icon(Icons.keyboard_arrow_right)
));
}

//返回整个页面
return Scaffold(
appBar: AppBar(
title: Text(“List Page”),
),
body: Center(
child: ListView(
children: list,
)
),
);
}
}

在main.dart增加list页面的引入

import ‘list.dart’;

修改Home页的按钮事件,增加Navigator.push跳转

FlatButton(
color: Colors.blue,textColor: Colors.white,
onPressed: () {
Navigator.push(context, MaterialPageRoute(builder:(context) {
return ListPage();
}));
},
child: Text(“Click ME”,style: TextStyle(fontSize: 20.0) ),
)

核心方法就是:Navigator.push(context,MaterialPageRoute)

跳转示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

6.2 更多页面跳转使用路由表

在MaterialApp中,有一个属性是routes,我们可以对路由进行命名,这样跳转的时候,只需要使用对应的路由名字即可,如:Navigator.pushNamed(context, RouterName)。点击两个不同的按钮,分别跳转到ListPage,和Page2去。

Main.dart修改一下如下

import ‘package:flutter/material.dart’;
import ‘list.dart’;
import ‘page2.dart’;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: ‘Flutter Demo’,
//路由表定义
routes:{
“ListPage”:(context)=> ListPage(),
“Page2”:(context)=> Page2(),
},
home: MyHomePage(),
);
}
}

class MyHomePage extends StatefulWidget{
@override
MyHomePageState createState() => MyHomePageState();
}

class MyHomePageState extends State{
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(“我是Title”),
),
body: Center(
child:Column(
children:[
RaisedButton(
child: Text(“Clikc to ListPage” ),
onPressed: () {
//根据命名路由做跳转
Navigator.pushNamed(context, “ListPage”);
},
),
RaisedButton(
child: Text(“Click to Page2” ),
onPressed: () {
//根据命名路由做跳转
Navigator.pushNamed(context, “Page2”);
},
)

]
)
)
);
}

}

示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我们有了路由以后,就可以开始在一个项目里用不同的页面,去学习不同的功能了。

6.3 路由传参

列表页跳转到详情页,需要路由传参,这个在flutter体系里,又是怎么做的呢?

首先,在main.dart里,增加详情页DedailPage的路由配置

//路由表定义
routes:{
“ListPage”:(context)=> ListPage(),
“Page2”:(context)=> Page2(),
“DetailPage”:(context)=> DetailPage(), //增加详情页的路由配置
},

并修改ListPage里ListTile的点击事件,增加路由跳转传参,这里是将整个item数据对象传递

ListTile(
title: Text(item[“title”],style: TextStyle(fontSize: 18.0) ),
subtitle: Text(item[“subtitle”]),
leading: Icon( Icons.fastfood, color:Colors.orange ),
trailing: Icon(Icons.keyboard_arrow_right),
onTap:(){
//点击的时候,进行路由跳转传参
Navigator.pushNamed(context, “DetailPage”, arguments:item);
},
)

详情页DetailPage里,获取传参并显示

import ‘package:flutter/material.dart’;
class DetailPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
//获取路由传参
final Map args = ModalRoute.of(context).settings.arguments;

return Scaffold(
appBar: AppBar(
title: Text(“Detail Page”),
),
body:
new Column(
children: [
Text(“我是Detail页面”),
Text(“id: a r g s [ ′ i d ′ ] " ) , T e x t ( " i d : {args['id']}" ), Text("id: args[id]"),Text("id:{args[‘title’]}”),
Text(“id:${args[‘subtitle’]}”)
],
)

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

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

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

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

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

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后说一下我的学习路线

其实很简单就下面这张图,含概了Android所有需要学的知识点,一共8大板块:

  1. 架构师筑基必备技能
  2. Android框架体系架构(高级UI+FrameWork源码)
  3. 360°Androidapp全方位性能调优
  4. 设计思想解读开源框架
  5. NDK模块开发
  6. 移动架构师专题项目实战环节
  7. 移动架构师不可不学习微信小程序
  8. 混合开发的flutter

Android学习的资料

我呢,把上面八大板块的分支都系统的做了一份学习系统的资料和视频,大概就下面这些,我就不全部写出来了,不然太长了影响大家的阅读。

330页PDF Android学习核心笔记(内含上面8大板块)

Android学习的系统对应视频

总结

我希望通过我自己的学习方法来帮助大家去提升技术:

  • 1、多看书、看源码和做项目,平时多种总结

  • 2、不能停留在一些基本api的使用上,应该往更深层次的方向去研究,比如activity、view的内部运行机制,比如Android内存优化,比如aidl,比如JNI等,并不仅仅停留在会用,而要通过阅读源码,理解其实现原理

  • 3、同时对架构是有一定要求的,架构是抽象的,但是设计模式是具体的,所以一定要加强下设计模式的学习

  • 4、android的方向也很多,高级UI,移动架构师,数据结构与算法和音视频FFMpeg解码,如果你对其中一项比较感兴趣,就大胆的进阶吧!

希望大家多多点赞,转发,评论加关注,你们的支持就是我继续下去的动力!加油!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

你们的支持就是我继续下去的动力!加油!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值