【喵咪专场】还不来领取你的小可爱吗??

简介: 我为流浪猫做了这样一款软件,快来领取你的小可爱吧!纯Flutter编写的App,使用MVP架构哦,快来看看!!!
前言:在前几天的一个回家的晚上,我路过了一家专门领养流浪宠物的小家,我在那里待了2个多小时,我为这些动物感到难过,包括?和?,那一刻我就想到,许多动物需要一个新家,我就想编写一个app,用于帮助这些动物(虽然很困难哈哈?)

话不多说,先上效果图:是不是很炫酷~

tt0.top-591909.gif

源码地址:https://github.com/taxze6/flutter_rehoming(希望给点点star?)

本文分析重点:

  • 基于GetX封装,MVP架构
  • 检测是否是第一次登录,是否展示引导页
  • 引导页的登录动画处理(封装处理)
  • 首页底部特效导航栏(暂无分析,原因有兴趣大家可以看文章的最后)
  • 其他的动画效果(暂无分析,原因有兴趣大家可以看文章的最后)

使用插件:

#状态管理 + 路由管理
get: 4.2.0
?
# 本地存储 + 图片缓存
shared_preferences: ^2.0.6
cached_network_image: ^3.0.0

1.实现基于Getx封装,MVP架构

mvp的全称为Model-View-Presenter,Model提供数据,View负责显示,Controller/Presenter负责逻辑的处理。

举个例子:

屏幕截图 2021-11-03 125837.jpg

使用Getx进行封装:

数据存放:

class SplashModel {
  late String Background;
  late String SplashText;
  late String SplashButtonText;
  BuildContext? context = Get.context;
?
    ///初始化数据
  SplashModel() {
    Background = "images/splash/Splash.png";
    SplashText = "Rehoming and adoption. You find each other.";
    SplashButtonText = "Let's Start";
  }
}

在controller中定义SplashModel,使用数据:

class SplashController extends GetxController {
  final SplashModel splashModelState = SplashModel();
 }

在view中使用控制器:

final controller = Get.put(SplashController());
final state = Get.find<SplashController>().splashModelState;
?
//使用:
Text(state.SplashText)

2.检测是否是第一次登录,是否展示引导页

这里就需要使用全局信息配置了,然后使用shared_preferences本地持久化

简单的定义用户信息:

UserLoginResponseModel userLoginResponseModelFromJson(String str) => UserLoginResponseModel.fromJson(json.decode(str));
?
String userLoginResponseModelToJson(UserLoginResponseModel data) => json.encode(data.toJson());
?
class UserLoginResponseModel {
  UserLoginResponseModel({
    this.token,
    this.name,
    this.id,
  });
?
  String? token;
  String? name;
  int? id;
?
  factory UserLoginResponseModel.fromJson(Map<String, dynamic> json) => UserLoginResponseModel(
    token: json["token"],
    name: json["name"],
    id: json["id"],
  );
?
  Map<String, dynamic> toJson() => {
    "token": token,
    "name": name,
    "id": id,
  };
}

全局配置怎么去做呢?

定义一个Global文件

class Global{}

在这个文件中我们可以进行app的全局配置

例如:

/// 用户配置
static UserLoginResponseModel? profile = UserLoginResponseModel(token: null);
?
///是否是第一次打开
static bool isFirstOpen = false;
?
///是否登录
static bool isOfflineLogin = false;

重点来啦!定义一个init方法用于初始化:

static Future init() async{
    // 运行初始
    WidgetsFlutterBinding.ensureInitialized();
    //本地存储初始化
    await LoacalStorage.init();
    // 读取离线用户信息
    var _profileJSON = LoacalStorage().getJSON(STORAGE_USER_PROFILE_KEY);
    if (_profileJSON != null) {
      profile = UserLoginResponseModel.fromJson(_profileJSON);
      isOfflineLogin = true;
    }
?
    // android 状态栏为透明的沉浸
    if (Platform.isAndroid) {
      SystemUiOverlayStyle systemUiOverlayStyle = const SystemUiOverlayStyle(statusBarColor: Colors.transparent);
      SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
    }
    isFirstOpen = !LoacalStorage().getBool(STORAGE_DEVICE_ALREADY_OPEN_KEY);
    if (isFirstOpen) {
      LoacalStorage().setBool(STORAGE_DEVICE_ALREADY_OPEN_KEY, true);
    }
}

之后我们就可以在main文件中初始化这配置文件

void main() => Global.init().then((value) => runApp(MyApp()));

然后我们就可以进行判断啦:

Obx(() => Scaffold(
  body: controller.isloadWelcomePage.isTrue
      ? SplashPage() //引导页
      : Global.isOfflineLogin
      ? HomePage() //首页
      : LoginPage(), //登录页
)

3.引导页的登录动画处理(封装处理)

在上方我们已经进行了SplashModel的数据定义

那么让我们来看看动画吧,因为时MVP架构,所以我们关于AnimationController的处理要放到controller中,我们使controller继承于SingleGetTickerProviderMixin。

class SplashController extends GetxController
    with SingleGetTickerProviderMixin {
   AnimationController? animationController;
}

然后再初始化动画(记得销毁哦):

@override
void onInit() {
  super.onInit();
  animationController = AnimationController(
      duration: const Duration(milliseconds: 1500), vsync: this);
  animationController!.forward();
}
?
@override
  void onClose() {
    // TODO: implement onClose
    super.onClose();
    animationController!.dispose();
 }

按钮动画(view):

Widget Splash_Button(BuildContext context) => ScaleTransition(
//动画处理
      scale: Tween<double>(begin: 0, end: 1).animate(CurvedAnimation(
        parent: controller.animationController!,
        curve: const Interval(0.3, 0.6, curve: Curves.fastOutSlowIn),
      )),
      child: GestureDetector(
        onTap: () {
          controller.getTo();
        },
        child: Container(
         //按钮
        ),
      ),
    );

就是这么的简单,如果觉得不够详细可以自己下拉源码查看~

关于引导页的背景,我们这里有个优化的点,提前缓存图片: 在controller中onInit中缓存:

@override
  void onInit() {
    super.onInit();
    _precacheImage(splashModelState.Background, splashModelState.context!);
  }
void _precacheImage(String imageUrl, BuildContext context) {
  precacheImage(AssetImage(imageUrl), context);
}
相关文章
|
1天前
|
开发者
第十一期乘风伯乐活动开启,快来推荐你身边热爱分享的技术达人吧
乘风伯乐奖,面向阿里云开发者社区已入驻乘风者计划的博主(技术/星级/专家),邀请用户入驻乘风者计划即可获得乘风者定制周边等实物奖励。本期面向阿里云开发者社区寻找100位乘风伯乐,邀请人数月度TOP 1 获奖者(大于108人)可获得cherry樱桃MX3.0S键盘及伯乐之星证书!
1717 172
第十一期乘风伯乐活动开启,快来推荐你身边热爱分享的技术达人吧
|
开发者
【开发者7日学】求职达人训练营上线啦~快来打卡赢好礼
阿里云培训中心联合开发者社区推出求职达人训练营7天学习活动,由阿里师兄们围绕行业介绍、职业选择、职场经验等内容进行分享,帮助大学生快速了解真实职场环境、提升实用求职技巧、培养必备职业素养等。
【开发者7日学】求职达人训练营上线啦~快来打卡赢好礼
|
开发者 知识图谱
2021年,我和阿里云开发者社区发生了这么多故事!分享送礼品
2021年即将过去,阿里云开发者社区在这期间发生了许多变化: 藏经阁近300本技术电子书,百万次用户下载 推出“乘风者计划”,吸引近千位技术博主入驻 开展近百场训练营,与开发者共同成长 免费推出近200个体验场景,让你轻松跨越上云第一步 举行百场ACE线上线下活动,让更多开发者找到技术同路人 全球300余位阿里云MVP,贡献行业数字化转型的实践与思考 数场问答活动,万余个用户问题得到解答 听取用户意见,社区页面变得更合理、功能越来越多
|
Java 开发者 知识图谱
Beats耳机、机械键盘等五重好礼等你来领! ——《我的Java打怪日记》有奖征文比赛
? ? 在过去的几年里,阿里云开发者社区为广大开发者提供了包含博客、问答、在线学习、上云工具、创业扶持等一系列服务,以满足大家学习、交流、云上工作的需求。 ? ? 今天,社区平台全新升级!我们欢迎更多热爱技术创作的开发者加入,在这里畅所欲言、书写天地。无论你是小白还是大神,只要你有分享技术的欲望,有关于学习、工作的技术思考、成长感悟,我们欢迎你来开发者社区
357 0
Beats耳机、机械键盘等五重好礼等你来领! ——《我的Java打怪日记》有奖征文比赛
|
开发者
2024 乘风者计划全新启航!快来加入吧!
?2021年,阿里云开发者社区焕新升级,重磅推出“乘风者计划”!诚邀四海技术博主入驻社区,泼墨云间,书写天地。入驻社区,即可享丰厚权益! 新的一年,乘风者计划重磅升级!
248893 81
2024 乘风者计划全新启航!快来加入吧!
|
弹性计算 Cloud Native 安全
【开发者大会—开发者社区活动获奖攻略!】小编带你玩游戏!涨知识!领奖品!
开发者大会—开发者社区活动已拉开帷幕,5.29日线下活动正式开启动!线上活动即刻发车!!超多小游戏,超多奖品,让你边玩边学习!什么?担心游戏太难??别担心,小编特意整理超详细获奖攻略!快上车!
“变强吧2021”礼包领取说明
“变强吧2021”礼包领取说明
|
开发者
快来领取秋天的第一份奖品
OpenAPI 开发者挑战赛第三期获奖名单公示
快来领取秋天的第一份奖品
|
机器学习/深度学习 人工智能 Cloud Native
2020云栖训练营正式开营!一键赢得“栖”心好礼!
阿里云开发者社区带你最快的方式、最近的距离走进云栖大会——训练营分会场!
1721 0
2020云栖训练营正式开营!一键赢得“栖”心好礼!
http://www.vxiaotou.com