Flutter 简单实现BaseWidget,腾讯T3大佬亲自教你

.deactivate

If the subtree containing the State object is removed from the tree (e.g., because the parent built a widget with a different runtimeType or Widget.key), the framework calls the deactivate method. Subclasses should override this method to clean up any links between this object and other elements in the tree (e.g. if you have provided an ancestor with a pointer to a descendant’s RenderObject).

如果视图集合中删除子视图(因为父视图由一个个不同runTimetype或key创建的子视图构建),框架层会调用deactivate函数。State子类应该重写该函数来清除此对象与树中的其他元素之间的任何关联(如果你为此对象提供了指向其他元素 RenderObject的指针)

返回到第一个page时:

I/flutter ( 7347): BaseWidgetState__HomePageWidgetState_deactivate

I/flutter ( 7347): BaseWidgetState__HomePageWidgetState_build

I/flutter ( 7347): BaseWidgetState__NextPageWidgetState_deactivate

I/flutter ( 7347): BaseWidgetState__NextPageWidgetState_dispose

. dispose

At this point, the framework might reinsert this subtree into another part of the tree. If that happens, the framework will ensure that it calls build to give the State object a chance to adapt to its new location in the tree. If the framework does reinsert this subtree, it will do so before the end of the animation frame in which the subtree was removed from the tree. For this reason, State objects can defer releasing most resources until the framework calls their dispose method.

此时此刻,框架层可能重新插入子视图到另外区域的视图中。如果发生这种情况,框架层将会调用build,State对象的子视图能够适应父视图新的位置。如果框架层确实插入了子视图,它将在动画帧结束之前重新插入,在动画帧中子树被从树中移除。因此,State对象可以推迟释放大部分资源,直到框架调用dispose函数。

If the framework does not reinsert this subtree by the end of the current animation frame, the framework will call dispose, which indicates that this State object will never build again. Subclasses should override this method to release any resources retained by this object (e.g., stop any active animations).

如果框架层在当前动画帧结束之前没有重新插入这个子树,那么框架将调用dispose函数,这表明这个状态对象将永远不再构建。子类应该覆盖这个方法来释放这个对象保留的任何资源(例如,停止任何活动的动画)。

After the framework calls dispose, the State object is considered unmounted and the mounted property is false. It is an error to call setState at this point. This stage of the lifecycle is terminal: there is no way to remount a State object that has been disposed.

框架层调用dispose函数后,当前State对象被视为不在挂载了,并且挂载的属性值为false。此刻调用setState是个错误,生命周期的这个阶段是终端:无法重新加载已经释放的State对象。

总结大概意思就是:框架层将要执行销毁函数时,若插入了widget到视图树种那么State对象释放会推迟同时会执行build函数;若没有插入widget到视图树中,框架层很快调用dispose函数,执行资源释放。

基类:

import ‘package:flutter/material.dart’;

abstract class BaseWidget extends StatefulWidget {

@override

BaseWidgetState createState() {

return getState();

}

BaseWidgetState getState();

}

abstract class BaseWidgetState extends State {

String curPage;

String tag = “BaseWidgetState_”;

@override

void initState() {

super.initState();

onCreate();

tag = tag + curPage+“_”;

print(tag + “initState\n”);

}

@override

void didChangeDependencies() {

print(tag + “didChangeDependencies\n”);

super.didChangeDependencies();

}

@override

Widget build(BuildContext context) {

print(tag + “build\n”);

return Scaffold(

body: baseBuild(context),

);

}

@override

void didUpdateWidget(T oldWidget) {

print(tag + “didUpdateWidget\n”);

super.didUpdateWidget(oldWidget);

}

@override

void reassemble() {

print(tag + “reassemble\n”);

super.reassemble();

}

@override

void deactivate() {

print(tag + “deactivate\n”);

super.deactivate();

}

@override

void dispose() {

print(tag + “dispose\n”);

onDes();

super.dispose();

}

void onCreate() {}

baseBuild(BuildContext context) {}

void onDes() {}

}

Page1:

class HomePage extends BaseWidget {

@override

BaseWidgetState getState() {

return _HomePageWidgetState();

}

}

class _HomePageWidgetState extends BaseWidgetState {

@override

void onCreate() {

super.onCreate();

curPage = “_HomePageWidgetState”;

}

@override

baseBuild(BuildContext context) {

// TODO: implement baseBuild

//return super.baseBuild(context);

return Center(

child: Container(

margin: EdgeInsets.only(top: 200.0),

child: Column(

crossAxisAlignment: CrossAxisAlignment.center,

children: [

Text(“首页”),

GestureDetector(

onTap: () async {

Navigator.push(context,

new MaterialPageRoute(builder: (BuildContext context) {

return new NextPage();

}));

},

child: Padding(

padding: EdgeInsets.all(10.0),

child: Text(

“\n跳转下一页”,

style: TextStyle(backgroundColor: Colors.blue),

),

),

)

],

),

),

);

}

}

Page2:

import ‘package:flutter/material.dart’;

import ‘package:flutter/services.dart’;

import ‘package:flutter_base_widget/base_widget.dart’;

import ‘package:flutter_base_widget/view/three_page.dart’;

class NextPage extends BaseWidget {

@override

BaseWidgetState getState() {

// TODO: implement getState

return _NextPageWidgetState();

}

}

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

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

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

img

img

img

img

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

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

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

总结

最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上我整理的几十套腾讯、字节跳动,京东,小米,头条、阿里、美团等公司19年的Android面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

技术进阶之路很漫长,一起共勉吧~

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

东,小米,头条、阿里、美团等公司19年的Android面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

[外链图片转存中…(img-DW3pQJAp-1712510639578)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

技术进阶之路很漫长,一起共勉吧~

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值