博客做单页网站/深圳网站制作设计

博客做单页网站,深圳网站制作设计,云服务器做网站好吗,西乡做网站公司目录 前言 一、从demo开始体现下Getx的用法 二、从最简单的功能开始 1.新建一个Flutter工程 2.GetX初体验 1.路由跳转 1.普通路由跳转 2.跳转并从堆栈中销毁当前页面 3.跳转并销毁之前所有页面 4.跳转以及传值 2.更方便的实现SnackBar、Dialog、BottomSheet 三、Ge…

目录

前言

一、从demo开始体现下Getx的用法

二、从最简单的功能开始

1.新建一个Flutter工程

2.GetX初体验

1.路由跳转

1.普通路由跳转

2.跳转并从堆栈中销毁当前页面

3.跳转并销毁之前所有页面

4.跳转以及传值

2.更方便的实现SnackBar、Dialog、BottomSheet

三、Getx完整的状态管理功能

1.GetBuilder

1.简单的计时器

2.使用GetBuilder的id参数局部更新

3.使用GetBuilder要注意的点

2.Obx

1.简单的计时器

2.多个响应式变量实例

3.总结

3.GetX小组件

4.GetX其它的一些实用功能

1.设置动画效果

2.国际化


前言

        这篇文章会从一个简单的工程开始,介绍下GetX的功能。

一、从demo开始体现下Getx的用法

        我们先看看getX的路由跳转功能,如下如1所示:

图1.GetX实现路由跳转功能

        在图1的过程中,我们实现了路由的跳转,以及路由跳转的时候从堆栈中移除当前页面的功能。

        在本篇博客的demo中,还提供了Getx路由跳转的传值功能,以及使用GetX实现SnackBar、Dialog,路由的别名跳转等功能。

图2.路由功能

图3.使用GetX实现Snackbar,Dialog,BottomSheet

二、从最简单的功能开始

        写这篇文章的时候,笔者的Flutter版本信息如下:

        图4.Flutter本地开发环境

1.新建一个Flutter工程

        本来想着一步一步的把创建的过程提出来的,仔细一想,这些基础的代码看到的兄弟们应该都会,这里直接贴出来新建的这个工程吧。

        不使用getx版本的实例代码在这里。

        您可以下载下来看一下这些功能怎么实现,实在懒或者是感觉代码太简单的haul的话也可以在脑海中思考下这些功能的实现。

        下面我们来比较下如何使用Getx实现这些功能。

2.GetX初体验

        和其他的Flutter三方库一样,笔者这里用的getx的版本为4.6.6.首先我们应该在yaml文件中配置下getX。

get: ^4.6.6

        安装好之后,我们把MaterialApp改成GetMaterialApp即可在项目中使用GetX了。

1.路由跳转

1.普通路由跳转

        我们先看一下普通的路由跳转,例如在上面的例子中,普通的路由跳转我们应该这么写:

// 导航到 SecondPage
Navigator.push(context,MaterialPageRoute(builder: (context) => const SecondPage()),);

        很长的一段代码,使用get之后,代码如下:

Get.to(()=>const SecondPage());

        代码是不是简单了很多,而且不需要获取上下文的context(有些情况下获取context比较麻烦)。

2.跳转并从堆栈中销毁当前页面

        我们只需要下面一行代码即可:

Get.off(const ThirdPage());

        不使用GetX代码如下:

Navigator.pushReplacement( context, MaterialPageRoute(builder: (context) => const ThirdPage()), );

3.跳转并销毁之前所有页面

        同样一样代码即可:

Get.offAll(const ThirdPage());

4.跳转以及传值

       当我们需要使用路由跳转并传值的时候,我们仅需要再GetMaterialApp中配置getPages属性,代码如下:

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:state_management/fourth.dart';
import 'package:state_management/second.dart';
import 'package:state_management/third.dart';
import 'home.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});@overrideWidget build(BuildContext context) {return GetMaterialApp(title: 'Flutter Demo',theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),useMaterial3: true,),getPages: [GetPage(name: "/", page: ()=> const MyHomePage()),GetPage(name: "/second", page: ()=> const SecondPage(),transition: Transition.zoom),GetPage(name: "/third", page: ()=> const ThirdPage()),GetPage(name: "/fourth", page: ()=> FourthPage()),],home: const MyHomePage(),);}
}

        当我们需要跳转并传值的时候同样一行代码解决:

Get.toNamed("/fourth",arguments: "Something from second Screen");

        在需要接收传值的页面,使用下面的代码也可以一行代码解决:

Get.arguments != null ?Text("上一个页面传递的参数:${Get.arguments}"):const Text(''),

        我们还可以在当前页面接收下一个页面的会传值:

ElevatedButton(onPressed: () async { dataFromFourth = await Get.to(FourthPage()); setState(() { }); debugPrint("dataFromFourth:$dataFromFourth"); }, child: const Text('从第四个页面返回数据',style: TextStyle(fontSize: 12,fontWeight: FontWeight.bold),),),

2.更方便的实现SnackBar、Dialog、BottomSheet

       使用getx,我们可以在不使用context的情况下使用很少代码实现Snackbar、dialog,BottomSheet。

        以SnackBar为例,一行代码搞定Snack:

Get.snackbar("GetX is Awesome", "您应该尝试使用它",snackPosition: SnackPosition.BOTTOM);

        不使用getx,代码如下:

ScaffoldMessenger.of(context).showSnackBar(
  const SnackBar(
    content: Text('这是一个 SnackBar!'),
  ),
);

        上述代码的Getx实现示例代码在这里。

三、Getx完整的状态管理功能

        上一章节中,我们简单体验了GetX的以便方便之处,这一节我们将详细的讲解下Fluttter的状态管理功能。

1.GetBuilder

        这是一种手动状态管理器,内存消耗最小,使用较少的内存(接近0mb),当UI中的单独组件越多,性能越突出。

1.简单的计时器

        我们以计数器的效果为例,看一下GetBuilder的用法,在下面的实例中,我们点击count++按钮,计时器每次加1.

        图5.计时器实例

        我们看看如何实现图5的功能。

        首先我们创建一个GetxController用来保存计时器变量,这里要注意的是GetBuilder是手动状态管理器,我们需要主动的调用update方法,代码如下:

import 'package:get/get.dart';class CounterController extends GetxController{int counter = 0;void increment(){counter++;update();}
}

        在使用GetBuilder的页面,我们只需要使用GetBuilder包裹住自己的Widget即可。

        我们通过Get.put方法获取GetxController实例。

final CounterController counterController = Get.put(CounterController());

        当我们点击按钮的时候,直接调用GetxController中的方法即可:

counterController.increment();

        完整的一个代码如下:

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:state_management/controllers/counterController.dart';class StateManagementPage extends StatelessWidget {StateManagementPage({super.key});final CounterController counterController = Get.put(CounterController());@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(backgroundColor: Colors.purple,title: const Text('GetX | StateManagement',style: TextStyle(color: Colors.white,fontWeight: FontWeight.bold,fontSize: 16),),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[GetBuilder<CounterController>(builder: (_){return Text("当前Count的值:${_.counter}");},),// ElevatedButton(onPressed: (){}, child:Text('count++'',style: TextStyle(color: Colors.bold,))),const SizedBox(height: 20,),ElevatedButton(onPressed: (){counterController.increment();}, child: const Text('count+1',style: TextStyle(color: Colors.black,))),const SizedBox(height: 40,),ElevatedButton(onPressed: (){}, child: const Text('更新姓名和存储数量')),]),),);}
}

        在上述的代码中,我们首先初始化了一个GetxController实例,然后调用该实例的increment方法,初次之外,我们还可以每次创建GetBuilder的时候,都调用GetxController的初始化方法,代码如下:

GetBuilder<CounterController>(builder: (_){
  return Text("当前Count的值:${_.counter}");
  },
  init: CounterController(),
),

        然后我们去ROM中查找GetxController,代码如下:

Get.find<CounterController>().increment();

        完整代码如下:

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:state_management/controllers/counterController.dart';class StateManagementPage extends StatelessWidget {StateManagementPage({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(backgroundColor: Colors.purple,title: const Text('GetX | StateManagement',style: TextStyle(color: Colors.white,fontWeight: FontWeight.bold,fontSize: 16),),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[GetBuilder<CounterController>(builder: (_){return Text("当前Count的值:${_.counter}");},init: CounterController(),),// ElevatedButton(onPressed: (){}, child:Text('count++'',style: TextStyle(color: Colors.bold,))),const SizedBox(height: 20,),ElevatedButton(onPressed: (){Get.find<CounterController>().increment();}, child: const Text('count+1',style: TextStyle(color: Colors.black,))),const SizedBox(height: 40,),ElevatedButton(onPressed: (){}, child: const Text('更新姓名和存储数量')),]),),);}
}

2.使用GetBuilder的id参数局部更新

        GetBuilder提供了一个id参数,用于局部更新界面。通过指定不同的id,可以实现更精细的控件刷新,避免整个页面刷新。

        我们以下面的demo为例:点击不同的按钮,更新不同的计数器:

       图6.使用GetBuilder参数局部更新

        在控制器中使用update指定id:

import 'package:get/get.dart';

class PartialRefreshController extends GetxController{
  int counter1 = 0;
  int counter2 = 0;

  void incrementCounter1(){
    counter1++;
    update(['counter1']); //只更新id为counter1的GetBuilder
    update();
  }
  void incrementCounter2(){
    counter2++;
    update(['counter2']); //只更新id为counter2的GetBuilder
  }

}

        在页面中使用不同的GetBuilder和id:

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:state_management/controllers/partialRefreshController.dart';class PartialRefreshPage extends StatelessWidget {const PartialRefreshPage({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(backgroundColor: Colors.purple,title: const Text('GetX | StateManagement',style: TextStyle(color: Colors.white,fontWeight: FontWeight.bold,fontSize: 16),),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [const SizedBox(height: 40,),GetBuilder<PartialRefreshController>(id: 'counter1',builder: (controller) => Text('counter1: ${controller.counter1}'),init: PartialRefreshController(),),const SizedBox(height: 40,),GetBuilder<PartialRefreshController>(id: 'counter2',builder: (controller) => Text('counter2: ${controller.counter2}'),init: PartialRefreshController(),),const SizedBox(height: 40,),ElevatedButton(onPressed: () {Get.find<PartialRefreshController>().incrementCounter1();},child: const Text('counter1++'),),const SizedBox(height: 40,),ElevatedButton(onPressed: () {Get.find<PartialRefreshController>().incrementCounter2();},child: const Text('counter2++'),),],)),);}
}

3.使用GetBuilder要注意的点

  1. GetBuilder用于简单的状态管理,它是一个手动状态管理器,需要我们手动调用update方法更新页面
  2. 使用GetBuilder的时候,要确保对应的GetxController被初始化
  3. 使用 id 参数可以实现局部更新,减少不必要的界面重建。

2.Obx

        在 Flutter 中,Obx 是 GetX 提供的一种响应式小部件(widget),用于监听和响应数据变化。与 GetBuilder 不同,Obx 使用了 GetX 的响应式变量(Rx 类型),可以自动响应变量的变更并刷新对应的界面,不需要手动调用 update() 方法。Obx 的特点是简单、灵活,特别适合数据频繁变化的场景。

1.简单的计时器

        我们还以计时器代码为例:

        当我们使用Obx的时候,第一步先定义一个控制器,包含响应式变量counter和增加计数的方法。

import 'package:get/get.dart';class CounterController extends GetxController {// 定义一个响应式变量var counter = 0.obs;// 增加计数的方法void increment() {counter++; // 更新变量,Obx 会自动响应变化}
}

        然后我们就可以在界面中使用Obx。

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'counter_controller.dart'; // 引入控制器class CounterPage extends StatelessWidget {@overrideWidget build(BuildContext context) {// 初始化控制器final CounterController counterController = Get.put(CounterController());return Scaffold(appBar: AppBar(title: Text('Obx 示例'),),body: Center(child: Obx(() {// Obx 会自动监听 counter 变量的变化return Text('点击次数: ${counterController.counter}',style: TextStyle(fontSize: 24),);}),),floatingActionButton: FloatingActionButton(onPressed: () {counterController.increment(); // 调用 increment 更新 counter},child: Icon(Icons.add),),);}
}

2.多个响应式变量实例

        如果控制器中有多个响应式变量,每个变量改变时都会触发 Obx 的重建。

        控制器的代码如下:

import 'package:get/get.dart';class MultiCounterController extends GetxController {var counter1 = 0.obs;var counter2 = 0.obs;void incrementCounter1() {counter1++;}void incrementCounter2() {counter2++;}
}

        在界面中分别用Obx监听counter1和counter2的变化。

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'multi_counter_controller.dart';class MultiCounterPage extends StatelessWidget {@overrideWidget build(BuildContext context) {final MultiCounterController counterController = Get.put(MultiCounterController());return Scaffold(appBar: AppBar(title: Text('Obx 多变量示例')),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Obx(() => Text('计数器1: ${counterController.counter1}', style: TextStyle(fontSize: 24))),Obx(() => Text('计数器2: ${counterController.counter2}', style: TextStyle(fontSize: 24))),ElevatedButton(onPressed: counterController.incrementCounter1,child: Text('增加计数器1'),),ElevatedButton(onPressed: counterController.incrementCounter2,child: Text('增加计数器2'),),],),),);}
}

3.总结

  1. Obx 非常适合频繁变化的小范围状态管理,自动监听并响应 Rx(响应式)变量的变化。

  2. 使用 Obx 无需手动调用 update(),代码更简洁。

  3. 适合响应频繁或实时性较高的场景,比如计数器、表单输入等

3.GetX小组件

        在 Flutter 中使用 GetX 包装器可以直接在 UI 中使用 GetX 的响应式管理。你这里的代码使用 GetX 小部件来监听和显示 UserController 中 user 的数据变化。这种方法可以简化代码,将状态更新与 UI 绑定在一起。下面是完整的代码示例,解释如何通过 GetX 实现对用户数据的实时更新。

        我们以更新用户名称为例,看一下GetX小组件如何和UI绑定。

1.第一步:创建爱你UserController

import 'package:get/get.dart';class User {String name;User({required this.name});
}class UserController extends GetxController {// 创建一个响应式的 user 对象var user = User(name: 'John Doe').obs;// 更新用户名称的方法void updateUser(String newName) {user.update((val) {val?.name = newName;});}
}

2.第二步:在界面中使用GetX绑定数据

        在界面中使用 GetX<UserController> 小部件来监听 user 的变化。每当 user 的 name 属性发生变化时,Text 小部件将自动更新。

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'user_page.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});@overrideWidget build(BuildContext context) {return GetMaterialApp(title: 'GetX Example',theme: ThemeData(primarySwatch: Colors.blue),home: UserPage(),);}
}

4.GetX其它的一些实用功能

1.设置动画效果

        我们可以设置路由跳转时候的一些动画效果,例如缩放效果:

        图8.路由跳转缩放效果

        一行代码即可实现上述的功能:

Get.to(()=>const OtherPage(),transition: Transition.zoom);

2.国际化

        GetX提供了国际化的功能,我们只需要继承Translations,把要国际化的内容以键值对的形式放在字典里即可:

import 'package:get/get.dart';class Messages extends Translations {@overrideMap<String, Map<String, String>> get keys => {'en_US': {'hello': 'Hello World',},'de_DE': {'hello': 'Hallo Welt',}};
}

        使用的时候,只要将.tr追加到指定的键上,就会使用Get.localeGet.fallbackLocale的当前值进行翻译。

Text('title'.tr);

        传递参数给GetMaterialApp来定义语言和翻译。

return GetMaterialApp(
    translations: Messages(), // 你的翻译
    locale: Locale('zh', 'CN'), // 将会按照此处指定的语言翻译
    fallbackLocale: Locale('en', 'US'), // 添加一个回调语言选项,以备上面指定的语言翻译不存在
);

        当我们需要修改语言的时候,调用Get.updateLocale(locale)来更新语言环境。然后翻译会自动使用新的locale。

var locale = Locale('en', 'US');
Get.updateLocale(locale);

        读取系统语言,使用window.locale。

import 'dart:ui' as ui;

return GetMaterialApp(
    locale: ui.window.locale,
);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/58224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目文章 | 药学TOP期刊PRChIP-seq助力揭示激酶LIMK2促进梗死不良重构的机制

急性心肌梗死&#xff08;MI&#xff09;是全球死亡的主要原因&#xff0c;尽管MI的死亡率有所下降&#xff0c;缺血性心力衰竭的发病率却呈上升趋势。这一现象提示我们&#xff0c;尽管在急救和治疗急性心肌梗死方面取得了进展&#xff0c;但心脏在梗死后的长期功能恢复仍然是…

Prometheus新手必看:三步搞定基于文件、DNS和Consul的服务发现

一、基于文件的服务发现 基于文件的服务发现是仅仅略优于静态配置的服务发现方式&#xff0c;它不依赖于任何平台或第三方服务&#xff0c;因而也是最简单和通用的服务发现方式。Prometheus Server定期从文件中加载Target信息文件可使用JSON或YAML格式&#xff0c;它含有定义的…

成品气楼参考图集有哪些?盘点5本实用图集,你都知道哪几本

成品气楼也被称为通风天窗、自然通风器、屋顶通风器&#xff0c;是帮助厂房、商业建筑体等建筑通风换气的大型设备&#xff0c;被广泛应用在各行各业。想要成品气楼的通风、采光、排烟作用得到充分发挥&#xff0c;需选型合理&#xff0c;配置合适&#xff0c;安装得当&#xf…

v4.7+版本用户充值在交易统计中计算双倍的问题修复

app/services/statistic/TradeStatisticServices.php 文件中 $whereInRecharge[recharge_type] no_system; $whereInRecharge[recharge_type] system; app/model/user/UserRecharge.php 中 修改此搜索器内容 public function searchRechargeTypeAttr($query, $value){ if…

二百七十一、Kettle——ClickHouse增量导入数据清洗记录表

一、目的 在完成错误数据表任务后&#xff0c;需要对每条错误数据的错误字段及其字段值进行分析 Hive中原有SQL语句和ClickHouse现有SQL语句很大不同 二、Hive中原有代码 2.1 表结构 --31、静态排队数据清洗记录表 create table if not exists hurys_db.dwd_data_clean_…

vue3+ts实时播放视频,视频分屏

使用vue3以及播放视频组件Jessibuca Jessibuca地址 使用循环个数来实现分屏 效果图&#xff0c;四屏 九屏 dom代码 <div class"icon"><div class"icon-box"><span class"text">分屏&#xff1a;</span><el-icon …

银行信贷风控专题:Python、R 语言机器学习数据挖掘应用实例合集:xgboost、决策树、随机森林、贝叶斯等

全文链接&#xff1a;https://tecdat.cn/?p38026 原文出处&#xff1a;拓端数据部落公众号 分析师&#xff1a;Fanghui Shao 在当今金融领域&#xff0c;风险管控至关重要。无论是汽车贷款违约预测、银行挖掘潜在贷款客户&#xff0c;还是信贷风控模型的构建&#xff0c;以及…

解决ElasticSearch启动成功却无法在浏览器访问问题

目录 前言&#xff1a; 问题复现 &#xff1a; 解决问题&#xff1a; 1、修改sysctl.conf文件 2、在sysctl.conf文件增加这段东西 3、 然后保存退出&#xff0c;输入以下命令使其生效 结语&#xff1a; 前言&#xff1a; 这篇文章是小白我今天突然启动es&#xff0c;发现e…

【华为HCIP实战课程二十五】中间到中间系统协议IS-IS配置实战续系统ID区域ID,网络工程师

上章简单讲解了ISIS基本配置,本章继续详细讲解ISIS配置及实施 IS-IS配置拓扑 1、R1进行配置IS-IS [R1]display current-configuration configuration isis isis 1 network-entity 49.0124.1111.1111.1111.00 //配置NET地址,由三部分组成,区域ID、系统ID和固定的SEL 00 i…

微服务之网关、网关路由、网关登录校验

简介&#xff1a;来源&#xff1a;SpringCloud微服务开发与实战&#xff0c;java黑马商城项目微服务实战开发&#xff08;涵盖MybatisPlus、Docker、MQ、ES、Redis高级等&#xff09; 认识网关 前端请求不能直接访问微服务&#xff0c;而是要请求网关&#xff1a; 网关可以做…

DDRPHY数字IC后端设计实现系列专题

在对 LPDDR3 物理层接口模块进行后端设计之前&#xff0c;需要对该模块的功能结 构以及后端物理设计流程的相关理论进行深入的分析和研究。本章第一节详细分 析了本次 LPDDR3 物理层接口模块的结构&#xff0c;为该模块的布图布局的合理规划奠 定了理论基础&#xff0c;并且分析…

python机器人编程——一种3D骨架动画逆解算法的启示(上)

目录 一、前言二、fabrik 算法三、python实现结论PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源ps3.移动小车相关文章资源ps3.wifi小车控制相关文章资源 一、前言 我们用blender等3D动画软件时&#xff0c;会用到骨骼的动画&#xff0c;通过逆向IK动力学…

大数据之VIP(Virtual IP,虚拟IP)负载均衡

VIP&#xff08;Virtual IP&#xff0c;虚拟IP&#xff09;负载均衡是一种在计算机网络中常用的技术&#xff0c;用于将网络请求流量均匀地分散到多个服务器上&#xff0c;以提高系统的可扩展性、可靠性和性能。以下是对VIP负载均衡的详细解释&#xff1a; 一、VIP负载均衡的基…

想要音频里的人声,怎么把音频里的人声和音乐分开?

在音频处理领域&#xff0c;将音频中的人声和音乐分开是一个常见需求&#xff0c;尤其对于音乐制作、影视后期以及个人娱乐应用来说&#xff0c;这种分离技术显得尤为重要。随着科技的发展&#xff0c;现在已经有多种方法可以实现这一目的。 一、使用专业音频处理软件 市面上有…

动态规划 —— 路径问题-不同路径 ||

1. 不同路径 || 题目链接&#xff1a; 63. 不同路径 II - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/unique-paths-ii/description/ 2. 算法原理 状态表示&#xff1a;以莫一个位置位置为结尾 dp[i]表示&#xff1a;以[i&#xff0c;j]位置为结尾时…

Telephony IMS

1、IMS结构 IMS的启动过程,IMS业务依附于phone进程启动,当phone进程启动时拉起对应的框架代码。 当phone进程启动时,会启动ImsReslover类,该类用于寻找对应的IMS apk实现,并进行绑定。 当绑定成功后,ImsServiceController会保存IMS APK中的如下对象IImsRegistration IIms…

Consul微服务配置中心部署(在线安装)

博主介绍&#xff1a; 计算机科班人&#xff0c;全栈工程师&#xff0c;掌握C、C#、Java、Python、Android等主流编程语言&#xff0c;同时也熟练掌握mysql、oracle、sqlserver等主流数据库&#xff0c;具有丰富的项目经验和开发技能。提供相关的学习资料、程序开发、技术解答、…

Spring Task—定时任务

Spring Task 是 Spring 提供的一种轻量级定时任务调度功能&#xff0c;内置在 Spring 框架中。与 Quartz 等重量级调度框架相比&#xff0c;Spring Task 使用简便&#xff0c;无需额外依赖&#xff0c;适合在简单的调度任务场景中使用。通过注解配置方式&#xff0c;开发者可以…

分布式数据库技术金融应用规范技术架构

目录 引 言 概述 技术框架 技术框架概述 物理资源层 计算模块 功能特性 功能架构概述 基本功能 部署灵活性 并发处理能力 扩缩容 扩容 缩容 引 言 随着金融领域分布式架构的转型升级&#xff0c;分布式数据库技术在金融领域应用逐步深入。为规范分布 式数据库技…

从0开始electron+vue2搭建环境

使用环境&#xff1a;node版本16.16.0 目录 搭建vue项目安装electron打包electron 搭建vue项目 已有vue2的环境直接进项安装electron步骤 没有的请先移动到这里查看 vue2脚手架搭建项目流程 我就不另外记录了 安装electron 直接运行 vue add electron-builder安装完成后&…