前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Flutter 状态管理之GetX库

Flutter 状态管理之GetX库

作者头像
晨曦_LLW
发布于 2024-05-25 00:36:36
发布于 2024-05-25 00:36:36
74202
代码可运行
举报
运行总次数:2
代码可运行
Flutter 状态管理之GetX

  • 前言
  • 正文
    • 一、创建项目
    • 二、状态组件
    • 三、状态更新UI
    • 四、GetX库
      • ① 添加依赖
      • ② 局部刷新
      • ③ 全局刷新
    • 五、源码

前言

  Flutter使用的是声明式UI,是通过状态去更新UI组件的,因此我们首先就要学习状态的使用。同样为了简化原本的状态使用,我们会使用Getx库。

正文

  之前说要写Flutter,一拖就是一年多,有些不好意思。现在都24年了,终于等到你,下面还是按照我们最属于的思路来吧。

一、创建项目

首先我们创建项目,Flie → New → New Flutter Project...

在这里插入图片描述
在这里插入图片描述

然后选择Flutter,这里可以看到Flutter SDK path,已经配置好了,点击Next。

在这里插入图片描述
在这里插入图片描述

然后输入工程名为study_state,目前我们只考虑AndroidiOS两个平台,因此其他的就不勾选了。

在这里插入图片描述
在这里插入图片描述

点击Create按钮,完成项目的创建。

在这里插入图片描述
在这里插入图片描述

  创建后我们可以看到main.dart,这里是flutter启动文件,同时我启动了一个模拟器,用的雷电模拟器,至于为什么不用AS自带的模拟器,只能说懂的都懂,不懂的也劝你别去用。

  下面我们首先运行在模拟器上看看,运行到模拟器的时间会比较长,不过运行之后当你再次修改代码之后可以通过热重载直接在模拟器上显示出修改后的内容,快捷键是Ctrl + S,图标是一个黄色的闪电。有时候快捷键不生效则你可以手动的点击这个闪电按钮,如果也不生效就重新安装,总会生效的,做开发就要有一颗平常心。

运行好了,效果如下图所示:

在这里插入图片描述
在这里插入图片描述

  当我们点击右下角的浮动按钮之后就会看到屏幕中的数字加1,关于这个里面的内容我在第一篇Flutter文章中就介绍过了,因此下面我们就不过多介绍代码,我们将main.dart中的代码全部清空,如下图所示:

在这里插入图片描述
在这里插入图片描述

然后我们再来一步一步的写代码,在这个过程中我们能了解到更多的东西。

二、状态组件

首先我们写一个main函数,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void main() {

}

然后我们在这个当前这个文件中再写一个MyApp类,如下图所示:

在这里插入图片描述
在这里插入图片描述

  这里我继承了StatelessWidget,这是一个无状态组件,在你输入之后会有提示,注意一下导包是material.dart中的,推荐你使用这个里面的StatelessWidget,MyApp的代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MyApp extends StatelessWidget {
  
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    throw UnimplementedError();
  }
}

  这里重新里面的build()函数,在这里面我们就可以写UI了,但是我们先不写,你可以把MyApp理解为Android的Application,然后我们再写一个HomePage,继承StatefulWidget 这是一个有状态的组件,重写里面的createState(),代码我们也先不改,你可以把HomePage 理解为Activity。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class HomePage extends StatefulWidget {

  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    throw UnimplementedError();
  }
}

  然后我们再写一个_HomePageState 类,继承自State,这是一个抽象类,支持有状态组件,那么我们传递HomePage进去,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class _HomePageState extends State<HomePage> {
  
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    throw UnimplementedError();
  }
}

  这里面的build()函数中我们同样可以设置UI,现在我们就了解了无状态和有状态两种组件,在 Flutter 中,有两种类型的小部件:StatelessWidgetStatefulWidget。它们在功能和使用上有一些区别。

  1. StatelessWidget(无状态小部件):
    • 它是一个不可变的小部件,意味着一旦创建就不能再更改它的状态。
    • 它的属性(props)在创建时被设置,并且在整个生命周期中保持不变。
    • 当父级小部件发生更改时,StatelessWidget 将重新构建,但状态不会发生变化。
    • 由于不需要跟踪状态的改变,StatelessWidget 的构建过程更加高效。
  2. StatefulWidget(有状态小部件):
    • 它是一个可变的小部件,可以在运行时改变其内部状态。
    • 它具有一个持久的状态对象(State),用于存储和跟踪小部件的变化。
    • 当父级小部件发生更改时,StatefulWidget 通过更新关联的状态对象来重新构建。
    • StatefulWidget 通常用于处理需要响应用户交互或动态变化的情况。

在实践中,以下是一些使用场景的示例:

  • 使用 StatelessWidget:当小部件的外观和内容不会随时间而改变时,推荐使用 StatelessWidget,例如静态文本、图标等。
  • 使用 StatefulWidget:当小部件的外观和内容需要根据用户交互、数据变化或其他条件动态更新时,需要使用 StatefulWidget,例如表单、列表视图等。

  需要注意的是,StatefulWidgetState 对象一起工作,后者存储和管理小部件的状态。当使用 StatefulWidget 时,通常需要同时创建一个与之关联的状态类。

  总结起来,StatelessWidget 是一个不可变的小部件,适用于静态内容,而 StatefulWidget 是一个可变的小部件,适用于需要跟踪状态变化的场景。

下面我们将前面所写的代码给串起来,首先是main函数中,修改后代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void main() {
    return runApp(MyApp());
}

  这里使用了一个runApp()函数,里面传入一个组件即可,无论是什么组件,这里我们传入MyApp(),那么当我们启动之后会运行main函数,然后渲染MyApp()组件,下面我们修改MyApp的代码,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Study State",
      theme: ThemeData(useMaterial3: true),
      home: HomePage(),
    );
  }
}

  这里我们通过构建MaterialApp(),在home属性中添加了HomePage(),那么内容就以HomePage()为主了,再看HomePage ,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() {
    return _HomePageState();
  }
}

  这里面的key是一个标识HomePage组件的唯一键,createState()方法在创建HomePage时会被调用。createState()方法返回一个_HomePageState对象,它是HomePage的具体状态类。状态类(State)的主要作用是管理StatefulWidget的状态,并根据需要更新小部件的UI。每当HomePage的状态发生变化时,Flutter会调用_HomePageState类中的build方法来构建最新的UI,下面我们再来看_HomePageState,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Align(
        alignment: Alignment.center,
        child: Container(
          width: 200,
          height: 200,
          alignment: Alignment.center,
          child: Column(
            children: [
              Text("Study State"),
              ElevatedButton(onPressed: () {
                print("点击了");
              }, child: Text("按钮"))
            ],
          ),
        ),
      ),
    );
  }
}

  这里首先使用了一个Scaffold(),这是一个页面的构成组件,body属性定义了页面的主要内容区域。在body中,使用Align组件将其子组件在父容器中居中显示。Alignment.center表示子组件在父容器中的居中对齐。

Align的子组件是一个Container,设置宽度和高度(200x200)。alignment属性设置为Alignment.center,将子组件在自身容器中进行居中对齐。child属性是一个Column组件,这是一个纵向布局组件,里面是一个数组,可以包含多个组件,它包含了两个子小部件:一个Text组件和一个带有文本的ElevatedButton组件。在按钮的点击事件中我们打印一下日志,下面我们重新运行一下。

在这里插入图片描述
在这里插入图片描述

点击按钮后,看控制台。

在这里插入图片描述
在这里插入图片描述

三、状态更新UI

  下面我们通过状态来更新UI,比如我们将点击按钮将文本内容改成大写,再点击改成小写,下面我们修改_HomePageState类中的代码,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class _HomePageState extends State<HomePage> {
  String test = "study state";
  bool isUppercase = false;

  void changeText() {
    setState(() {
      isUppercase = !isUppercase;
      print(isUppercase ? "大写" : "小写");
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Align(
        alignment: Alignment.center,
        child: Container(
          width: 200,
          height: 200,
          alignment: Alignment.center,
          child: Column(
            children: [
              Text(isUppercase ? test.toUpperCase() : test.toLowerCase()),
              ElevatedButton(onPressed: () {
                changeText();
              }, child: const Text("按钮"))
            ],
          ),
        ),
      ),
    );
  }
}

  首先我们定义了两个变量,内容和是否大小写,然后写了一个changeText()函数,这个函数中使用了setState(() {}),用于改变状态,在这里面修改了isUppercase 的值,然后Text(isUppercase ? test.toUpperCase() : test.toLowerCase())这行代码,在初始情况下显示为小写,然后我们点击按钮调用changeText()函数,函数中更改isUppercase 的值,通过setState就会刷新UI,此时isUppercase 为true,则Text中显示大写,再点击一下为false就变成小写。这就是状态改变驱动UI。

主要改动地方如下图所示:

在这里插入图片描述
在这里插入图片描述

控制台日志如下图所示:

在这里插入图片描述
在这里插入图片描述

  通过这种方式当我们有数据改变时就可以更新UI了,只不过刚开始你需要习惯这种方式。声明式UI基本上都是这种方式,了解了Flutter基本的状态更新UI,下面我们再来学习一下GetX这个库。

四、GetX库

GetX是一个基于Flutter的状态管理和路由导航的解决方案,提供了简单、强大、高性能的工具和功能,以简化Flutter应用程序的开发过程。地址是:GetX,可以去了解一下,下面我们来使用它。

① 添加依赖

在项目的pubspec.yaml文件中,将GetX添加为依赖项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dependencies:
  get:

添加位置如下图所示:

在这里插入图片描述
在这里插入图片描述

这里后面我并没有写版本号,这表示获取最新的版本,如需获取指定版本,写法如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dependencies:
  get: ^4.3.8

然后点击Pub get,获取并安装GetX库,如下图所示:

在这里插入图片描述
在这里插入图片描述

  你也可以在Terminal命令行中输入flutter pub get命令,获取并安装GetX库。安装成功后你可以在控制台看到,如下图所示:

在这里插入图片描述
在这里插入图片描述

GetX安装成功,同时我们知道最新的版本是4.6.6。

② 局部刷新

  在使用之前我们先将原有的代码分离一下,也就是将Application和Activity分开,在lib下创建一个home文件夹,文件夹下新建一个home_page.dart文件,然后我们将main.dart中的部分代码挪到这里面,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() {
    return _HomePageState();
  }
}

class _HomePageState extends State<HomePage> {
  String test = "study state";
  bool isUppercase = false;

  void changeText() {
    setState(() {
      isUppercase = !isUppercase;
      print(isUppercase ? "大写" : "小写");
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Align(
        alignment: Alignment.center,
        child: Container(
          width: 200,
          height: 200,
          alignment: Alignment.center,
          child: Column(
            children: [
              Text(isUppercase ? test.toUpperCase() : test.toLowerCase()),
              ElevatedButton(onPressed: () {
                changeText();
              }, child: const Text("按钮"))
            ],
          ),
        ),
      ),
    );
  }
}

然后我们再看main.dart中的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

import 'home/home_page.dart';

void main() {
  return runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Study State",
      theme: ThemeData(useMaterial3: true),
      home: HomePage(),
    );
  }
}

  现在我们就进行了分离,下面就可以在home_page.dart中进行GetX的使用了,注意在使用的时候需要导包,在哪里用就在哪里导包,然后编辑器也会提示你导包的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:get/get.dart';

修改代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';
import 'package:get/get.dart';

class HomePage extends StatelessWidget {
  HomePage({super.key});

  RxString test = "study state".obs;
  RxBool isUppercase = false.obs;

  void changeText() {
    isUppercase.value = !isUppercase.value;
    if (isUppercase.value) {
      test.value = test.value.toUpperCase();
    } else {
      test.value = test.value.toLowerCase();
    }
    print(isUppercase.value ? "大写" : "小写");
  }

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      body: Align(
        alignment: Alignment.center,
        child: Container(
          width: 200,
          height: 200,
          alignment: Alignment.center,
          child: Column(
            children: [
              Obx(() => Text(test.value)),
              ElevatedButton(onPressed: () {
                changeText();
              }, child: const Text("按钮"))
            ],
          ),
        ),
      ),
    );
  }
}

  这里我们说明一下,在首先使用GetX之后,我将HomePage所继承的组件由StatefulWidget改成了StatelessWidget,然后为变量添加了.obs后缀,使这个变量可观察。然后在changeText()方法中修改可观察变量的值。最后使用Obx包裹需要局部刷新的组件,例如:Obx(() => Text(test.value)),当可观察变量值更新时,Obx包裹中的内容就会进行刷新。

  现在这种模式我们还可以再改一下,将涉及到数据改变的部分剥离出去,让我们的页面只专注于显示和更新即可,在home目录下新建一个home_controller.dart文件,里面的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:get/get.dart';

///Home页面控制器
class HomeController extends GetxController {
  RxString test = "study state".obs;
  RxBool isUppercase = false.obs;

  void changeText() {
    isUppercase.value = !isUppercase.value;
    if (isUppercase.value) {
      test.value = test.value.toUpperCase();
    } else {
      test.value = test.value.toLowerCase();
    }
    print(isUppercase.value ? "大写" : "小写");
  }
}

  这里就是创建一个HomeController类,继承自GetX的GetxController,注意导包别导错了,然后将changeText()方法挪过来即可,下面我们再会到home_page.dart中,修改代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:study_state/home/home_controller.dart';

class HomePage extends StatelessWidget {
  HomePage({super.key});

  @override
  Widget build(BuildContext context) {

    final HomeController homeController = Get.put(HomeController());

    return Scaffold(
      body: Align(
        alignment: Alignment.center,
        child: Container(
          width: 200,
          height: 200,
          alignment: Alignment.center,
          child: Column(
            children: [
              Obx(() => Text(homeController.test.value)),
              ElevatedButton(onPressed: () {
                homeController.changeText();
              }, child: const Text("按钮"))
            ],
          ),
        ),
      ),
    );
  }
}

  在build()方法中通过Get.put(HomeController()),得到控制器对象,然后在Text中通过控制器得到里面的值,同样可以调用里面的方法,这样我们就将业务和UI分离了。你现在运行之后效果是和之前一样的,可以试试呢。

③ 全局刷新

  全局刷新我们需要使用到GetBuilder,实际上他就是setState的优化,下面我们改动一下home_controller中的代码,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:get/get.dart';

///Home页面控制器
class HomeController extends GetxController {
  String test = "study state";
  bool isUppercase = false;
  String btnText = "大写";

  void changeText() {
    isUppercase = !isUppercase;
    if (isUppercase) {
      test = test.toUpperCase();
      btnText = "小写";
    } else {
      test = test.toLowerCase();
      btnText = "大写";
    }
    update();
  }
}

  这里就将.obs后缀去掉了,就不是一个可观察变量了,同时我增加了一个参数,用于显示按钮的文字,在changeText()方法中进行修改,最后调用update()进行全局更新,注意update()方法是结合GetBuilder使用的,下面我们改写home_page中的代码,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:study_state/home/home_controller.dart';

class HomePage extends StatelessWidget {
  HomePage({super.key});

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      body: GetBuilder<HomeController>(
          init: HomeController(),
          builder: (controller) {
        return Align(
          alignment: Alignment.center,
          child: Container(
            width: 200,
            height: 200,
            alignment: Alignment.center,
            child: Column(
              children: [
                Text(controller.test),
                ElevatedButton(
                    onPressed: controller.changeText,
                    child: Text(controller.btnText))
              ],
            ),
          ),
        );
      }),
    );
  }
}

  使用GetBuilder包裹构建一个可以全局刷新的组件,在初始化时得到HomeController(),然后在builder中就可以返回一个组件,组件中直接使用controller对象进行参数和方法的使用。

效果图如下所示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、源码

源码地址:study_state

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Flutter中命名路由模块化及传参
上面的代码中分别引入了三个页面:Form.dart 和 Search.dart 以及 Tabs.dart。
越陌度阡
2020/12/28
1.6K0
Flutter 系列之GetX的学习(1) --&gt; 状态管理
GetX 是 Flutter 的超轻量级强大解决方案。它快速、实用地结合了高性能状态管理、智能依赖注入和路由管理。
心安事随
2025/01/24
1331
Flutter 系列之GetX的学习(1) --&gt; 状态管理
Flutter 中 BottomNavigationBar 定义底部导航条
BottomNavigationBar 是底部导航条,可以让我们定义底部 Tab 切换,在Scaffold 组件中通过配置bottomNavigationBar来实现该功能。
越陌度阡
2020/12/23
1.3K0
Flutter 中 BottomNavigationBar 定义底部导航条
Flutter使用StatefulWidget有状态组件累计添加数组
import 'package:flutter/material.dart'; //快捷方式:fim void main() { runApp(MyApp()); } //自定义组件 class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return MaterialApp( home: Scaffo
明知山
2020/09/02
8820
Flutter:使用复选框进行下拉多选
本文向您展示了在 Flutter 中使用复选框实现下拉多选的两种不同方法。在第一种方法中,我们将从头开始构建多选。在第二种方法中,我们将使用第三方包快速完成工作。
徐建国
2022/03/30
3.4K0
Flutter:使用复选框进行下拉多选
第九十八期:Flutter学习(一)
昨天和今天除了写一些小程序的代码之外,都在学习flutter相关的内容。感觉flutter的学习成本之所以高,很大的原因其实是因为它的学习资料真正能学到东西的,其实还是它的官网,但是官网又是英文版的,读起来就比较费劲。
terrence386
2022/07/15
5500
Flutter 父子组件互调方法
使用 GlobalKey:可以为子组件创建一个 GlobalKey 对象,通过该 GlobalKey 可以获取到子组件的状态,并调用其方法。
訾博ZiBo
2025/01/06
1350
Flutter 父子组件互调方法
实现Flutter应用中的全局导航栏效果
在移动应用开发中,导航栏是用户与应用交互的重要组成部分之一。它不仅提供了应用程序中不同页面之间的导航功能,还可以展示应用的整体结构和主要功能。因此,设计一个清晰、易用的导航栏对于提升用户体验和应用的可用性至关重要。
繁依Fanyi
2024/03/30
2910
【Flutter 工程】006-路由跳转:go_router
GoRouter是一个用于Flutter应用程序的导航库,它提供了一种简单而强大的方式来管理应用程序的导航栈和路由。它可以帮助你组织和管理Flutter应用程序中的页面导航,使页面之间的跳转和参数传递更加方便。
訾博ZiBo
2025/01/06
1090
【Flutter 工程】006-路由跳转:go_router
第130期:flutter的状态组件和状态管理
怎样才能在我们的flutter应用中对用户输入做出响应?比如我们有个图标,我们想让它支持点击事件,或者在状态改变的时候换一个不同的图标。
terrence386
2023/02/25
1.6K0
第130期:flutter的状态组件和状态管理
flutter鸿蒙版本通过底部导航栏的实现熟悉架构及语法
在这篇博客中,我们将深入分析一个 Flutter 应用的完整代码,该应用实现了一个底部导航栏,允许用户在不同页面之间切换。我们将逐行讲解代码,帮助大家理解 Flutter 的结构、状态管理以及组件之间的交互。
淼学派对
2024/10/08
1590
Flutter 数据持久化存储之Hive库
以上的这些我们都不使用,这里要使用的是Hive库,地址是 Hive,感兴趣的可以自行了解,本文运行效果图。
晨曦_LLW
2024/05/25
4830
Flutter 数据持久化存储之Hive库
Flutter 多语言、主题切换之GetX库
  关于GetX库前面我们讲述了状态管理的使用,实际上GetX是非常强大的,功能很多,本篇文章中我们将介绍GetX的多语言切换和主题切换等功能。
晨曦_LLW
2024/05/25
1.2K0
Flutter 多语言、主题切换之GetX库
dart-flutter实现页面跳转
使用按钮在flutter应用中做到页面之间的跳转,一个简单的dmeo 直接上代码 这是lib/main.dart import 'package:flutter/material.dart'; import './pages/tabs.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(
Tom2Code
2023/02/14
7700
dart-flutter实现页面跳转
Flutter 加载网络图片的几种方式
对很多移动应用来说,加载网络图片是很常见的基本功能。Android中常用Glide等图片库。Flutter提供了Image组件来展示不同类型的图片。
AnRFDev
2021/02/01
3.2K0
Flutter 加载网络图片的几种方式
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面
卓伊凡
2025/01/24
840
Flutter GetX使用---简洁的魅力!
如果深度使用过Provider,Bloc这类依赖InheritedWidget建立起的状态管理框架;再看看GetX内部实现思想,就能发现,他们已经是俩种体系的东西了
小呆呆666
2021/02/01
7.8K0
Flutter GetX使用---简洁的魅力!
【Flutter 工程】001-Flutter 状态管理:Riverpod
状态管理处理应用程序数据流动和 UI 更新的关键概念。在 Flutter 应用程序中,状态管理确保应用程序 UI 和数据保持同步,共享和同步数据,并提供良好的代码结构和可维护性。
訾博ZiBo
2025/01/06
1440
【Flutter 工程】001-Flutter 状态管理:Riverpod
【- Flutter 性能 -】都 2021 年了,你的动画还在用 setState ?
对于每个 UI 帧来说,主要依次执行 Animate、Build、Layout、Compositing bits、Paint、Compositing。每当界面发生变化时,都是一帧触发会更新放入结果。如下每两格代表一帧的UI 时间(左)和 Raster 时间(右)。 当左侧很高时,说明你的界面写的有问题。看下面的两个 UI 帧, 可以看出 Build 占了很大部分,就说明 UI 可能存在某些低效率情况。
张风捷特烈
2020/12/18
1K0
【- Flutter 性能 -】都 2021 年了,你的动画还在用 setState ?
在 Flutter 使用 GetX 对话框
是移动应用程序的基本组成部分。他们帮助传递警告和重要信息,以及做具体的活动。当 Flutter 开发人员在 Flutter 制作一个对话框时,它利用上下文和生成器制作一个对话框。然而,对于开发人员来说,利用上下文和构建器来培养 Dialogs 是不合适的。
用户6256742
2024/05/29
2750
推荐阅读
相关推荐
Flutter中命名路由模块化及传参
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验