flutter状态管理---provider

flutter中的状态管理Provider 今天简单说一下flutter中的状态管理,我们这次使用provider; ps:先说一个概念,Model,模型,这里面定义了我们准备全局使用的数据,或者方法; 举个栗子:我们有一个User类,用来储存用户的信息,比如登录之后,我们会拿到用户的一些个人数据,那么这些数据就可以作为属性写在Model里,同时我们在User内部,还会提供一个upUser方法,用来更新用户信息,那么这个方法也可以写在Model中,OK,以上就是我们准备的User Model; 下面是正题,go,go,go 作为一个ios开发者,遇 阅读详情

状态管理的应用,在实际项目开发中应用场景也是不少的,截至目前,关于状态管理的插件也是有很多种了,这里就不罗列了,之前一直用的谷歌的provide,因为相对其他插件来说上手比较容易,but!万万没想到放弃维护了,和GitHub上某位大佬组队共同维护provider去了!没办法,只能再去看看provider,继续用provide的话怕以后出现问题,今天大概看了一下provider的简单用法。

看完之后发现,也没有什么太大变化嘛!当然,没有深入看,只是看了基本常规用法,求大佬轻喷?。

主要是main文件的注册方式发生了点变化。如下:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(builder: (_) => Counter()),
      ],
      child: MaterialApp(
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        debugShowCheckedModeBanner: false,
        home: Home(),
      ),
    );
  }
}

 还是以Counter为例:

import 'package:flutter/material.dart';

class Counter extends ChangeNotifier {
  int value = 0;

  void add() {
    this.value++;
    notifyListeners();
  }
}

设置值:

Provider.of<Counter>(context).add();

获取值并显示(还有另一种取值设置方法,个人不是太喜欢,哈哈):

Text("${Provider.of<Counter>(context).value}"),

关于设置值以及取值的用法,这些跟provide也没啥太大区别,无非换个名字而已:Provide----->Provider。

Flutter Provider状态管理---MVVM架构实战 MVVM架构是“Model-View-ViewModel”的缩写,它是一种软件架构模式,旨在将用户界面(View)的开发与应用程序逻辑(ViewModel)的开发分离开来。ViewModel是View和Model之间的桥梁,它负责将Model中的数据转换为View可以直接使用的数据。在MVVM架构中,View和ViewModel之间通过数据绑定进行通信。在本文中,我们介绍了如何使用Provider实现MVVM架构。MVVM架构可以帮助我们更好地组织Flutter应用程序中的代码并使其更易于维护。 阅读详情

相关推荐

Flutter Provider 详解:从状态管理痛点到实战落地

核心目标:替代,解决跨组件状态共享与冗余回调问题;核心流程Provider(顶层提供模型)→Consumer(下层消费模型)→(触发精准刷新);性能优化:优先用Consumer而非,通过child减少静态 UI 重建;构造选择:内部创建模型用create,外部传入实例用value,避免生命周期混乱;模型规范:数据模型需继承,通过触发更新。掌握以上内容,即可应对 Flutter 中 80% 以上的状态管理场景,后续可结合(管理多个模型)、Selector。

lpfasd123的博客 1414

flutter initState中读取provider数据

@override void initState() { /// 页面渲染完成后回调 WidgetsBinding.instance.addPostFrameCallback((_) { _hasLogin(); }); super.initState(); }

奇乐软件开发踩坑日志 961

Flutter Provider状态管理框架实战指南

Provider 是一个轻量级的Flutter库,它简化了在Flutter应用中管理状态的流程。从UI依赖于数据到数据的改变通知UI,Provider提供了一种高效且清晰的方法来构建动态的用户界面。Provider是一个基于监听者模式的状态管理解决方案,它使用了Flutter的来高效地跨widget树传递状态。它的设计哲学是简洁和无样板代码,使开发者能够以最少的努力来实现复杂的状态逻辑。Provider框架允许你创建可被多个Widgets共享的数据源。要实现这一点,你需要创建一个继承自。

weixin_35753291的博客 1174

使用 Flutter 实现 MVVM 架构

本文介绍了在Flutter中实现MVVM架构的方法,包括基本概念、设计、代码案例和实战应用,并探讨了扩展架构的方式。

陆业聪 5466

flutter-mvvm-provider-demo

flutter-mvvm-provider-demo

三部对接 sora-2:OpenAI 最新视频模型快速接入指南

本文介绍OpenAI最新视频生成模型Sora-2的接入方案,重点解析其Chat格式调用功能。开发者可通过在提示词中嵌入"横屏/竖屏""时长""清晰度"等要求快速生成视频。文章分三部分:1)基础准备(环境配置与API密钥获取);2)核心调用(提供Python/Java示例代码);3)结果查询与优化建议。Sora-2支持多语言调用,简化了视频生成流程,适用于短视频、广告创意等场景。

2501_93565190的博客 3426

Flutter Provider状态管理-Consumer

前言 如果对Consumer很了解的同学可以继续学习Flutter Provider状态管理 - Selector 个人觉得Flutter的学习有三个很重要的阶段 widget的学习和使用 数据以及状态的管理 和原生的交互 对于第一点不必多说,大家开始学习flutter的时候都是跟着官网或者博客来学习如何使用widget以及用widget组合成丰富多彩的界面。如果还没有学习的同学可以前...

u013894711的专栏 1万+

Qt Design Studio 入门指南:从零开始打造炫酷UI(详细+实用+轻松上手)

本文是Qt Design Studio的详细入门指南,旨在帮助UI设计新手从零开始轻松打造炫酷界面。文章系统介绍了软件的核心概念、安装步骤、主界面解析,并通过创建一个完整的登录界面实例,手把手教学如何拖拽组件、设置属性、添加交互状态与动画。同时,分享了创建自定义组件、管理资源以及提升效率的实用技巧与常见问题解决方案,让读者能够快速上手并应用于实际项目开发。

devops8pract的博客 588

Flutter Provider状态管理

我们这里创建了一个类继承了,我们这里的案例是以计数器为案例,所有我们定义一个变量count,以及一个改变数值的increment方法,当我们调用increment后会对count进行+1,最后调用count++;}}以上是对Provider进行了介绍、优势、类结构和说明以及一个基本使用的例子,相对于使用来说,显然Provider使用起来更简单。但是从它的提供者、消费者这些类来看稍微复杂,后面的章节中我们来讲讲这些类。在我们上一篇文章中对Provider。

Dream It Possible 3668

在 CentOS Stream 10 上搭建 Kubernetes 集群并支持开发调试与日志查看

搭建 Kubernetes 集群的每个步骤详细的文档。

灵犀物润 1644

[Linux外设驱动详解]RK3588 U-Boot网络功能深度分析

本文深入分析了RK3588平台上U-Boot的网络功能实现,主要内容包括: 网络架构:详细剖析了从硬件层到协议层的完整网络栈架构,包括GMAC驱动、TFTP/NFS启动、网络命令等关键组件。 驱动实现:重点介绍了RK3588 GMAC驱动结构,包含关键数据结构、专用操作函数集、设备树兼容性配置和GRF寄存器设置。 功能实现:详细说明了驱动初始化流程、RGMII速度适配机制以及PHY接口配置过程。 高级特性:涵盖了网络启动功能、镜像更新和MAC地址传递到Linux内核的机制。 文档通过代码片段和流程图清晰展示

Just Linux! 1114

Flutter 状态管理之 Provider

前言: Provider 是 Google I/O 2019 大会上宣布的现在官方推荐的状态管理方式,我在学习和使用之后感觉很不错,因为它真的很容易上手,所以就写篇博客记录一下吧!! Provider GitHub 地址:github.com/rrousselGit… 再贴两个油管上的视频(第一个只讲了 ChangeNotifierProvider,没有讲 MultiProvider 的情况):...

weixin_33860553的博客 3196

Cadence SIP Layout 简单教程-第一章

以摄像头模组软硬结合板为例,描述layout的整个完整过程,从而掌握基本技能。 第一章 准备工作 第一节 原理图不用说layout前需要绘制原理图,原理图不在本文讨论范围内,所以列为准备工作。 需要特别说明的是,绘制原理的最终目的是导出网络表,网络表中的重要参数footprint是让layout软件选择正确封装的关键,所以这里讲解一下原理图设置footprint的位置。在原理图中双击零件,...

whp1920的博客 1万+

Flutter状态管理Provider

在之前的文章中介绍了 Google 官方仓库下的一个状态管理Provide。乍一看这俩玩意可能很容易就被认为是同一个东西,仔细一看,这不就差了一个字吗,有什么区别呢。 首先,你要知道的最大的一个区别就是,Provide 被 Provider干掉了...假如你就是用了 Provide 的,你的内心应该已经开始骂了,这不是坑爹吗 。不过幸运的是,你要从 Provide 迁移到 Provider 并不是太难。 Provider 从名字上就很容易理解,它就是用于提供数据,无论是在单个页面还是在整个app ...

大灰狼的小绵羊哥哥的博客 984

2、Minikube安装Ingress

文章目录前言一、Ingress安装二、Ingress Demo1.创建一个pod和service2.部署ingress3.添加minikube域名映射三、遇到的坑 前言 上篇介绍了Minikube的安装,本篇介绍一下如何在Minikube中安装Ingress。 一、Ingress安装 Ingress安装很简单,Minikube里面带了Ingress附件。 安装Ingress minikube addons enable ingress 禁用Ingress minikube addons disa

star_apple的博客 3071

基于STC8A8K64S4A12的掉电唤醒定时器应用,极大降低产品功耗

通过合理的配置和编程,我们可以充分发挥单片机的功能,实现能效优化和电池寿命延长的目标。其中,掉电唤醒定时器是其一项重要功能,可以在系统处于睡眠状态时通过定时器的计时功能进行唤醒,从而实现对系统功耗的有效控制。使用STC8A8K64S4A12的掉电唤醒定时器功能,我们可以在不影响系统正常工作的情况下,大大降低产品的功耗。通过以上的代码,我们实现了一个简单的掉电唤醒定时器功能。当系统进入睡眠模式后,定时器开始计时,到达预设的唤醒时间后,定时器中断被触发,系统从睡眠模式唤醒,执行相应的操作。

CodeSageX的博客 1090

Flutter 状态管理(Provider)

Flutter 状态管理(Provider)

m0_73016265的博客 1463

灰质-白质组织对比(Gray-white matter tissue contrast,GWC)计算以及可视化

GWC是深层灰质与浅表白质(superficial white matter,SWM)之间T1加权信号强度的比值,已知髓鞘中的胆固醇是T1加权信号强度的主要影响因素,因此GWC大致反映了大脑皮层和浅表白质之间的髓鞘化差异。GWC代表灰白质交界处的模糊程度,较低的GWC表明灰质和白质交界处更相似和更模糊;较高的GWC表明灰白质分界更加清楚。据之前的研究报道,局灶性皮质发育不良、颞叶癫痫、帕金森病、强迫症、精神分裂症和自闭症谱系障碍中存在灰白质交界区GWC异常增高或降低。 灰质信号强度和白质信号强度采集的示意图

xxx 733

Flutter _ 状态管理指南篇——Provider

我们可以在这里传入一个方法,并获得前后两个 Model 的实例,然后通过比较两个 Model 以自定义刷新规则,返回 bool 表示是否需要刷新。默认为 previous!= current 则刷新。当然,key 属性是肯定有的,常规操作。如果你还不太清楚的话,建议阅读我之前的这篇文章 [Flutter | 深入浅出Key] (为了让各位思维连贯,我还是在这里放上这个平淡无奇的 MyApp Widget 代码。😑@override。

2501_90392091的博客 1206

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

flutter provider状态管理使用

并提供了一种高效的方式来管理和共享应用中的状态。相比其他复杂的状态管理方案(如。是一种简单而强大的状态管理工具,适合大多数 Flutter 应用场景。是一个轻量级且易于使用的状态管理工具,它基于。我们创建一个简单的计数器示例,展示如何通过。,你可以轻松实现状态的集中管理和局部更新。以下是一个完整的示例,展示如何使用。更加简单直观,适合中小型项目。,以便在整个应用中访问状态。在 Flutter 中,

getapi的博客 845

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Flutter状态管理provider

在没有状态管理之前,我们使用setState去修改同步渲染本页面的数据,比如在一个Tab页,我们点击一个按钮,让数字+1,使用setState即可完成。 那我们想要再另外一个和本页面完全不相关的Tab页也完成同步动作,这个时候就要使用到状态管理了。 我们首先介绍provider provider是官方提供的一种状态管理,使用起来较简单 1、创建一个继承于ChangeNotifier的方法类,在这个类去实现一些增删改查的操作。例如: import 'package:flutter/mater.

一花一世界 一叶一菩提 1213

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Flutter状态管理之Provider的使用和架构分析

状态管理在Flutter中非常重要,但是它包含的内容又非常的广泛。 本文我们首先了解下什么是状态和状态管理呢?然后我们来了解官方的状态管理库Provider的使用,最后分析下Provider背后的秘密。 状态管理 状态 Flutter是声明式编程,Widget定义的UI都是在build()函数中实现的,这个函数的功能就是将状态转换成UI。 UI = f(state) 官方对状态的定义如下: whatever data you need in order to rebuild your

Dream It Possible 2248

flutter的Provider状态管理原理详解

Flutter的Provider是专门为Flutter处理状态而生,RenderObject树的重新渲染最原始的做法就是调用SetState方法,而Provider可以让你注重于数据逻辑的的改变,而无需关心RenderObject树的主动渲染,这不就是类似于mvvm模式,只要数据变化了,view树就会重新渲染该渲染的部分,而不需要咱们主动调用渲染。 下边先来看看Provider相关类怎么用,这里...

xiatiandefeiyu的博客 2927

Flutter 状态管理 Provider

Get对应方式则是Get.put和GetBuilder,Get.put提前存储数据对象,为GetBuilder组件指定数据类型作为泛型,因为Get基于单例,所以GetBuilder可以直接通过泛型获取到存入的对象,在builder方法中暴露,使得组件和数据建立了监听关系,并在数据更新后只驱动将其作为泛型的GetBuilder组件更新。element组件中包含了_parent属性,存放其父节点element,而其又实现了buildContext接口,包含了对树结构操作的方法。

weixin_51109304的博客 1219
上一篇: flutter实现底部Tab和顶部导航条切换
下一篇: 日期推算/日历(小程序)
尘彦
博客等级 码龄11年 92粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘彦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值