走两步?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进行状态管理和页面构建的一个典型例子。

相关推荐
Hello-Mr.Wang4 分钟前
vue3中开发引导页的方法
开发语言·前端·javascript
程序员凡尘31 分钟前
完美解决 Array 方法 (map/filter/reduce) 不按预期工作 的正确解决方法,亲测有效!!!
前端·javascript·vue.js
编程零零七4 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
(⊙o⊙)~哦6 小时前
JavaScript substring() 方法
前端
无心使然云中漫步6 小时前
GIS OGC之WMTS地图服务,通过Capabilities XML描述文档,获取matrixIds,origin,计算resolutions
前端·javascript
Bug缔造者6 小时前
Element-ui el-table 全局表格排序
前端·javascript·vue.js
xnian_7 小时前
解决ruoyi-vue-pro-master框架引入报错,启动报错问题
前端·javascript·vue.js
麒麟而非淇淋8 小时前
AJAX 入门 day1
前端·javascript·ajax
2401_858120538 小时前
深入理解MATLAB中的事件处理机制
前端·javascript·matlab
阿树梢8 小时前
【Vue】VueRouter路由
前端·javascript·vue.js