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

相关推荐
GIS程序媛—椰子11 分钟前
【Vue 全家桶】7、Vue UI组件库(更新中)
前端·vue.js
DogEgg_00118 分钟前
前端八股文(一)HTML 持续更新中。。。
前端·html
ZL不懂前端21 分钟前
Content Security Policy (CSP)
前端·javascript·面试
木舟100924 分钟前
ffmpeg重复回听音频流,时长叠加问题
前端
王大锤439135 分钟前
golang通用后台管理系统07(后台与若依前端对接)
开发语言·前端·golang
我血条子呢1 小时前
[Vue]防止路由重复跳转
前端·javascript·vue.js
黎金安1 小时前
前端第二次作业
前端·css·css3
啦啦右一1 小时前
前端 | MYTED单篇TED词汇学习功能优化
前端·学习
半开半落1 小时前
nuxt3安装pinia报错500[vite-node] [ERR_LOAD_URL]问题解决
前端·javascript·vue.js·nuxt