走两步?Getx一个Stateful页面,View和Controller,为什么要这么设计?

越简单越困难,嘿蛋炒饭。

先看代码

View

dart 复制代码
import 'package:flutter/material.dart';
import 'package:get/get.dart';

import 'index.dart';

class LampSelfHomeOfMusicPage extends StatefulWidget {
  const LampSelfHomeOfMusicPage({Key? key}) : super(key: key);

  @override
  State<LampSelfHomeOfMusicPage> createState() => _LampSelfHomeOfMusicPageState();
}

class _LampSelfHomeOfMusicPageState extends State<LampSelfHomeOfMusicPage>
    with AutomaticKeepAliveClientMixin {
  @override
  bool get wantKeepAlive => true;

  @override
  Widget build(BuildContext context) {
    super.build(context);
    return const _LampSelfHomeOfMusicViewGetX();
  }
}

class _LampSelfHomeOfMusicViewGetX extends GetView<LampSelfHomeOfMusicController> {
  const _LampSelfHomeOfMusicViewGetX({Key? key}) : super(key: key);

  // 主视图
  Widget _buildView() {
    return const Center(
      child: Text("LampSelfHomeOfMusicPage"),
    );
  }


// @override
// Widget build(BuildContext context) {
//   return GetBuilder<LampSelfHomeOfMusicController>(
//     init: LampSelfHomeOfMusicController(),
//     id: "lamp_self_home_of_music",
//     builder: (_) {
//       return Scaffold(
//         appBar: AppBar(title: const Text("lamp_self_home_of_music")),
//         body: SafeArea(
//           child: _buildView(),
//         ),
//       );
//     },
//   );
// }



  @override
  Widget build(BuildContext context) {
    return GetBuilder<LampSelfHomeOfMusicController>(
      init: LampSelfHomeOfMusicController(),
      id: "lamp_self_home_of_music",
      builder: (_) {
        return _buildView();
      },
    );
  }
}

Controller

dart 复制代码
import 'package:get/get.dart';

class LampSelfHomeOfMusicController extends GetxController {
  LampSelfHomeOfMusicController();

  _initData() {
    update(["lamp_self_home_of_music"]);
  }

  void onTap() {}

  @override
  void onInit() {
    super.onInit();
  }

  @override
  void onReady() {
    super.onReady();
    _initData();
  }

  @override
  void onClose() {
    super.onClose();
  }
}

走两步?分析分析?

这两份代码是Flutter中使用GetX库来管理状态和导航的一个例子。GetX是一个轻量级的Flutter库,用于状态管理、依赖管理和路由管理,它的目的是提供一个简单而强大的方法来构建Flutter应用程序。

关于视图 View

第一部分:页面组件(LampSelfHomeOfMusicPage

这个组件是一个StatefulWidget,它表示应用程序中的一个页面。页面使用AutomaticKeepAliveClientMixin混入,这允许页面在Tab切换或页面滚动时保持其状态,不被Flutter框架自动销毁重建。wantKeepAlive返回true表明你希望Flutter保持这个页面的状态。

build方法中,它返回_LampSelfHomeOfMusicViewGetX组件。这里使用了const关键字,表示该组件是不可变的,Flutter框架可以更高效地重建UI。

第二部分:视图组件(_LampSelfHomeOfMusicViewGetX

这个组件继承自GetView<T>,其中T是你希望这个视图绑定的控制器类型。这里TLampSelfHomeOfMusicControllerGetView提供了一个controller属性,直接访问绑定的控制器,而无需手动调用Get.find<T>()

_buildView方法负责构建页面的主视图,这里只是简单地显示了一个文本。在实际的应用中,这里会构建复杂的UI。

build方法使用GetBuilder来监听LampSelfHomeOfMusicController的变化。当控制器调用update()方法时,GetBuilder会重建其builder方法中的UI。这是GetX进行状态管理的方式之一。

关于控制器Controller

控制器(LampSelfHomeOfMusicController

控制器继承自GetxController,这是GetX状态管理的核心。控制器负责业务逻辑和状态更新。

  • onInit:当控制器初始化时调用。
  • onReady:当控制器准备好后调用,通常用于在UI构建完成后执行一些初始化操作。
  • _initData:这是一个自定义方法,用于初始化数据,它在onReady中被调用,并通过update()方法更新UI。

控制器通过update()方法触发绑定的UI更新,这里传递了一个ID,["lamp_self_home_of_music"],这样只有指定ID的GetBuilder会响应更新,这是进行局部更新的一种方式。

为什么这么写

使用GetX的好处是它简化了状态管理、依赖注入和路由管理。代码结构清晰,将业务逻辑和UI分离,易于维护和扩展。通过使用GetViewGetBuilder,它避免了频繁地使用setState来更新UI,从而提高了应用性能。此外,AutomaticKeepAliveClientMixin的使用确保了用户体验的连贯性,避免了不必要的页面重建。

总的来说,这段代码展示了在Flutter项目中使用GetX进行状态管理和页面构建的一个典型例子。

相关推荐
徐子颐10 分钟前
从 Vibe Coding 到 Agent Coding:Cursor 2.0 开启下一代 AI 开发范式
前端
小月鸭23 分钟前
如何理解HTML语义化
前端·html
jump6801 小时前
url输入到网页展示会发生什么?
前端
诸葛韩信1 小时前
我们需要了解的Web Workers
前端
brzhang1 小时前
我觉得可以试试 TOON —— 一个为 LLM 而生的极致压缩数据格式
前端·后端·架构
yivifu1 小时前
JavaScript Selection API详解
java·前端·javascript
这儿有一堆花1 小时前
告别 Class 组件:拥抱 React Hooks 带来的函数式新范式
前端·javascript·react.js
十二春秋1 小时前
场景模拟:基础路由配置
前端
六月的可乐2 小时前
实战干货-Vue实现AI聊天助手全流程解析
前端·vue.js·ai编程
一 乐2 小时前
智慧党建|党务学习|基于SprinBoot+vue的智慧党建学习平台(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·学习