惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tenable Blog
月光博客
月光博客
雷峰网
雷峰网
WordPress大学
WordPress大学
博客园 - 司徒正美
Last Week in AI
Last Week in AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
Visual Studio Blog
H
Help Net Security
Engineering at Meta
Engineering at Meta
Google DeepMind News
Google DeepMind News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
S
Security @ Cisco Blogs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
爱范儿
爱范儿
W
WeLiveSecurity
J
Java Code Geeks
Forbes - Security
Forbes - Security
H
Hacker News: Front Page
T
Threatpost
The Cloudflare Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
N
Netflix TechBlog - Medium
Latest news
Latest news
V2EX - 技术
V2EX - 技术
小众软件
小众软件
T
The Blog of Author Tim Ferriss
A
Arctic Wolf
B
Blog RSS Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
C
Check Point Blog
N
News | PayPal Newsroom
Cyberwarzone
Cyberwarzone
V
V2EX
TaoSecurity Blog
TaoSecurity Blog
P
Privacy & Cybersecurity Law Blog
Microsoft Security Blog
Microsoft Security Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
D
DataBreaches.Net
F
Fortinet All Blogs
阮一峰的网络日志
阮一峰的网络日志
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
IT之家
IT之家
K
Kaspersky official blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Google DeepMind News
Google DeepMind News
C
CXSECURITY Database RSS Feed - CXSecurity.com
www.infosecurity-magazine.com
www.infosecurity-magazine.com

Chenxu's Blog

RAG检索优化:从 68% 到 82.2% 学习深度学习 北邮计算机研究生选课指北 学习机器学习 上海篇 提出一个好问题 写代码的环境 选购一台合适的设备 计算机的第零课 序言 内蒙古篇 山东篇 一篇对transformers的疑惑 浅析GPUStack 浅谈后端项目分层 浙江篇 河南篇 一些三端协同的开发工具记录 浅谈编程语言中的 GC 在 Windows 上安装 Rust 美化博客 消息队列 MyBatis 现代交换原理2024年题目 回忆版 北邮计科本科课程指北 ClkLog埋点用户分析系统研究报告 大数据梧桐实验分享 大数据HBase实验分享 国产向量数据库研究实践 —— 基于 Milvus 的电影推荐系统 服务器环境配置 大数据HDFS实验分享 SSE多服务之间推送数据 数据库系统原理 操作系统 编译原理 天津篇 北京篇 手把手教你gozero从开发到部署 (5): gtodolist 之任务的删除 前端相关问题 vue3 + element-plus学习 git相关命令 人工智能原理 使用 MongoTemplate 时开启事务 MySQL Redis 力扣刷题笔记之动态规划 记录一次 VSCode 出现的各种奇怪的问题 手把手教你gozero从开发到部署 (4): 在 model 中自己编写函数实现数据库分页查询 记录平时用到的 windows 右键管理 记录平时使用的 linux 的指令 安装 gstore 并使用 java api 手把手教你gozero从开发到部署 (3): gtodolist 之任务的创建和修改 手把手教你gozero从开发到部署 (番外篇): 记录第一次部署 CI/CD 的流程 记录完成 gtodolist 中遇到的 bug 手把手教你gozero从开发到部署 (2): gtodolist 之 user 模块开发 手把手教你gozero从开发到部署 (1): gtodolist 项目说明和环境准备 快速入门 gozero 框架 vue部署在nginx上的相关问题 记一次安装scrapy的报错 将博客部署至服务器 Java CS143: Compliers 《MySQL必知必会》读书笔记(2) 初识 GORM 初识 gin 框架 Spring 《MySQL必知必会》读书笔记(1) 本地搭建博客 🤝友链 🙋🏻‍♂️关于 Browser and Device Check
手把手教你gozero从开发到部署 (番外篇): 介绍 gtodolist 前端项目
Chenxu · 2024-02-24 · via Chenxu's Blog

在经过了长达两周的放假学习和带薪学习后, 我终于做出了人生中第一个前端应用 (虽然甚至现在我都没搞明白 Dart 有几种数据类型), 项目地址在这里 ,演示地址在这里 下面我将介绍一下本项目使用的一些依赖, 设计结构和具体的实现.

项目依赖

总体上使用 Flutter 框架, 其他框架列表如下:

  • dio: 网络请求
  • date_format: 日期格式化
  • get: Getx 状态管理
  • logger: 日志框架
  • sp_util: 对 shared_preferences 框架的封装, 用于在内存中存储一些数据
  • intl: 时间戳和日期转换

设计结构

因为设计初期的原因多加了层 common 目录, 这个可以忽略

  • pages:
    • controller: 页面内请求的逻辑
    • view: 画页面的代码
    • binding: Getx 依赖注入
    • component:
      • body: 一些组件, 被 view 中的代码使用
  • constants: 一些常量内容, 比如 token 的名字等
  • http: 封装 dio 的 http 请求
  • middleware: 中间件, 如页面跳转鉴权等
  • models: 传输模型, 请求值和返回值的数据结构
  • routes: 页面路由
  • service: 向后端发送请求的代码, 可能会涉及到一些其他逻辑, 被 controller 调用, 调用 http 的代码发送请求; 有本地数据库时也可以将本地数据库的操作逻辑写在这里 (或者也可以单开一个 repository 目录也可以)
  • config: 放一些配置文件

具体实现

重点截取一些代码

定义页面路由, 中间件 和 binding:

GetPage(
  name: AppRoutes.task,
  page: () => const TaskListView(),
  binding: TaskBinding(),
  middlewares: [
    RouteAuthMiddleware(),
  ],
)

binding 依赖注入:

class LoginBinding implements Bindings {
  static final Logger _logger = Logger();

  @override
  void dependencies() {
    _logger.i('依赖注入');
    Get.lazyPut(() => UserService());
    Get.lazyPut<LoginController>(() => LoginController());
  }
}

controller:

class LoginController extends GetxController {
    // 这里就是具体的逻辑
}

view, 使用 controller 和 body:

class LoginView extends StatelessWidget {
  const LoginView({super.key});

  @override
  Widget build(BuildContext context) {
    return GetBuilder<LoginController>(
        builder: (controller) => const Scaffold(
              body: LoginBody(),
            ));
  }
}

body:

class LoginBody extends GetView<LoginController> {
  const LoginBody({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        // 这里就是正常的写页面
        // 因为继承了GetView所以可以不用Get.find()直接使用controller
    );
  }
}

全局配置类 (注意不要使用 GetMaterialApp 中 onInit 初始化一些变量, 可能会有问题):

class GlobalConfig {
  static final Logger _logger = Logger();

  static Future init() async {
    _logger.i('开始全局初始化');
    await SpUtil.getInstance();
    Get.put<UserService>(UserService());
    _logger.i('全局初始化结束');
  }
}

启动类:

Future<void> main() async {
  await GlobalConfig.init();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      debugShowCheckedModeBanner: false,
      enableLog: true,
      initialRoute: AppPages.initial,
      getPages: AppPages.routes,
    );
  }
}

本地调试命令:

# 防止CORS报错
flutter run -d chrome --web-renderer html --web-browser-flag "--disable-web-security"

打包成 Web 应用:

flutter build web --web-renderer html