notifyListeners();
}
}
}

@override
void init() {
model = getIt.get();
setContext(context);
setIsDispose(false);
}

void showLoading(bool isNeedLoading) {
if (isNeedLoading) {
needLoadingRequestCount++;
if (!isLoading) {
isLoading = true;
if (showLoadingFun != null) {
showLoadingFun!.call();
}
showLoadingFun?.call();
}
}
}

void dismissLoading(bool isNeedLoading) {
if (isNeedLoading) {
needLoadingRequestCount–;
if (needLoadingRequestCount == 0) {
isLoading = false;
if (dismissLoadingFun != null) {
dismissLoadingFun!.call();
}
dismissLoadingFun?.call();
}
}
}

/// 发起网络请求,同时处理异常,loading
void sendRequest(Future future, FutureOr onValue(T value),
{Function(Exception e)? error, bool isNeedLoading = false}) {
showLoading(isNeedLoading);
future.then((t) {
dismissLoading(isNeedLoading);
onValue(t);
});
if (isNeedCatchError) {
future.catchError((e) {
dismissLoading(isNeedLoading);
print(“====>error:$e”);
if (error != null) {
error(e);
}
});
}
}

@override
void dispose() {
super.dispose();
_isDispose = true;
setIsDispose(_isDispose);
}
}

@injectable
class LoginViewModel extends BaseViewModel {
@factoryMethod
LoginViewModel();

String loginName = “”;
String psw = “”;

///登录
void login() {
if (loginName.isEmpty) {
showToast(“登录账号不可为空”);
} else if (psw.isEmpty) {
showToast(“登录密码不可为空”);
} else {
sendRequest(model.login(loginName, psw), (value) {
if (value.errorCode == 0) {
value.data?.let((it) {
UserInfoSp.getInstance().uid = it.id ?? 0;
UserInfoSp.getInstance().token = it.token ?? “”;
UserInfoSp.getInstance().userName = it.username ?? “”;
});
pop();
push(MainPage());
} else {
showToast(value.errorMsg!);
}
}, isNeedLoading: true);
}
}
}

使用的第三方框架

  • 1. injectable
    配合get_it框架,在编译时生成代码,实现依赖注入
  • 2.dio
    实现网络请求
  • 3.get_it
    实现依赖注入
  • 4.retrofit
    结合dio实现网络请求,编译时生成网络请求的代码
  • 5.logger
    日志打印
  • 6.toast
    吐司
  • 7.event_bus
    实现不同页面和组件的通信
  • 8.json_serializable
    结合json_annotation实现json数据序列化
  • 9.extended_image
    实现网络图片的加载,强大的官方 Image 扩展组件, 支持加载以及失败显示,缓存网络图片,缩放拖拽图片,绘制自定义效果等功能
  • 10.webview_flutter
    实现网页的加载
  • 11.shared_preferences
    简单的数据持久存储
  • 12.pull_to_refresh
    实现下拉刷新和分页加载
  • 13.floor
    数据库,使用类似于retrofit
  • 14.flutter_swiper
    图片轮播

使用的架构和基础封装

  • 基于Flutter2.0,语法空安全
  • 结合Provider实现MVVM架构,封装了BaseState,BaseStatefulWidget,BaseViewModel
  • 结合模板方法模式,泛型,Mixin,依赖注入等方式,封装了大量重复的逻辑,简化了开发难度
  • Mixin类的封装:目前包含NavigatorMixin,ToastMixin,SharePreferenceMixin,EventBusMixin,DataBaseMixin
  • 基础Widget的封装:例如BottomDialog,CenterDialog,EnsureAndCancelDialog,LoadingDialog,PopupWindow,CommonWrap,LazyIndexedStack等等
  • BaseViewModel统一网络请求,统一发起网络请求,同时处理异常,loading
  • 使用扩展函数:扩展自Object,List,int,Widget,让代码更加简洁优雅
    后期规划
    ====
    1.路由,实现各模块,各业务的解耦
    2.组件化
    3.内存泄漏检测
    4.埋点框架
    5.各种炫酷动画

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

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

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

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

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

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

最后

其实要轻松掌握很简单,要点就两个:

  1. 找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。
  2. 多练。 (视频优势是互动感强,容易集中注意力)

你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

阿里P7Android高级教程

下面资料部分截图,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。

附送高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、近期面试跳槽、自身职业规划迷茫的朋友们。

Android核心高级技术PDF资料,BAT大厂面试真题解析;

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
**
[外链图片转存中…(img-B9AUlWOD-1712716530288)]

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

Logo

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

更多推荐