Flutter Getx 如何将 obs 绑定到 Widget? 对象GetXGetBuilder

如何解决Flutter Getx 如何将 obs 绑定到 Widget? 对象GetXGetBuilder

当我使用 2012ExprSP1_SQLEXPRWT_x64_ENU.exe 更新我的小部件时? 我不知道Getx如何联系我放入的东西。

代码是Rx()。 但我发送的数据是 _obx=Rx()。这不是"".obs,而是Rx()。 当我使用 RxString() 时。为什么"".obs.value="newString"可以知道谁更新了数据。

就像:

Rx()

当我将 log.value 更改为新字符串时,为什么 log2 不新鲜。

import 'package:flutter/material.dart';
import 'package:get/get.dart';

class GetIncrementPage extends StatefulWidget {
  GetIncrementPage({Key key}) : super(key: key);

  @override
  _GetIncrementPageState createState() => _GetIncrementPageState();
}

class _GetIncrementPageState extends State<GetIncrementPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('get'),),body: Container(
        alignment: Alignment.center,child: _body(),);
  }

  Widget _body() {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,children: [
        OutlineButton(
          child: Text('get 数字加减'),onPressed: c.increment,OutlineButton(
          child: Text('get log 变化'),onPressed: c.change,Obx(() {
          printInfo(info: '刷新了页面 get_example');
          return Text(c.count.toString());
        }),ObxValue((v) {
          printInfo(info: '刷新了页面 get_ObxValue_log1 ');
          return Text('logValue:' + v.toString());
        },ObjectKey('key').obs),Obx(() {
          printInfo(info: '刷新了页面 get_obx_log1');

          return Text('logObx:' + c.log.toString());
        }),Obx(() {
          printInfo(info: '刷新了页面 get_obx_log2');

          return Text(c.log2.toString());
        }),// ObxValue((var value) => Text('${value.toString()}'),c),],);
  }

  @override
  void dispose() {
    Get.delete<Controller2>();
    super.dispose();
  }

  final Controller2 c = Get.put(Controller2());
}

///
/// Created by fgyong on 2020/10/22.
///

class Controller2 extends GetxController {
  var count = 0.obs;
  var count2 = 0.obs;

  final log = ''.obs;
  final log2 = ''.obs;

  increment() => count++;
  @override
  void onClose() {
    printInfo(info: 'Controller close');
    super.onClose();
  }

  void change() {
    log.value += ' ${log.value.length}';
  }
}

为什么rx()可以与日志建立联系,请帮帮我。当我更新 Rx() 怎么知道什么时候登录?

请帮帮我。

解决方法

您可以使用 Get 中的 ObxGetX 小部件来“监听”您在 GetxController 中声明的可观察变量的更改。

我认为您也将 Rx 混淆为 ObserVER 与 ObservABLE。 Rx 是一个可观察对象,即您使用 Obx 或 GetX 小部件观察它的变化,(我猜您可以将这两个小部件称为“观察者”。)

基本示例

class Log2Page extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    Controller c = Get.put(Controller());
    // ↑ declare controller inside build method

    return Scaffold(
      body: SafeArea(
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: [
              Obx(
                      () => Text('${c.log2.value}')
              ),RaisedButton(
                child: Text('Add +1'),onPressed: c.change,)
            ],),);
  }
}

class Controller extends GetxController {
  RxInt log2 = 0.obs;

  void change() => log2.value++;
}
  1. 在使用 GetX 时,您可能不需要 StatefulWidget。 GetxController 存在于小部件的生命周期之外。状态存储在 GetX 控制器(而不是 StatefulWidget)中。
  2. GetX 通过您声明为 obs 的变量(如 count.obslog2.obs)处理流和订阅。当您想“聆听”或“观察”时,请使用 ObxGetX 小部件。这些会自动侦听其子项的 obs 更改,并在更改时重建。

Obx 对比 GetBuilder 对比 GetX

class Log2Page extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    Controller c = Get.put(Controller());

    return Scaffold(
      body: SafeArea(
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: [
              Obx(
                      () => Text('Obx: ${c.log2.value}')
              ),// ↓ requires manual controller.update() call
              GetBuilder<Controller>(
                builder: (_c) => Text('GetBuilder: ${_c.log2.value}'),// ↓ controller instantiated by Get widget
              GetX<Controller>(
                init: Controller(),builder: (_c) => Text('GetX: ${_c.log2.value}'),RaisedButton(
                child: Text('Update GetBuilder'),onPressed: c.update,// rebuild GetBuilder widget
              ),],);
  }
}

class Controller extends GetxController {
  RxInt log2 = 0.obs;

  void change() => log2.value++;
}

对象

监听可观察到的 (obs) 变化。控制器需要已经在其他地方声明/初始化才能使用。

GetX

监听可观察到的 (obs) 变化。如果没有在其他地方完成,可以使用 init: 构造函数参数初始化控制器本身。可选参数。如果 Controller 已经实例化,则可以安全地使用 init:。将连接到现有实例。

GetBuilder

是否听取obs的变化。必须由您手动重建,调用 controller.update()。类似于 setState() 调用。如果没有在其他地方完成,可以使用 init: 参数初始化控制器本身。可选。

,

首先:

when I "".obx.value="newString".why Rx() can know.

这是错误的,.obx 不存在,我猜你是说 .obs;

当你创建一个像 final a = ''.obs 这样的 OBS 变量时,这个变量的类型将是一个 RxString(),所以你可以使用任何你想要的观察这个变量。

我知道您可以使用两个小部件来观察您的屏幕:

GetX(),Obx()
,

见链接https://github.com/jonataslaw/getx/issues/937, 当 Obx() 构建时,我们将其命名为 ObxA,命名为“ABC”.obs abcobs,

Obx


  Widget get notifyChilds {
    final observer = getObs;
    getObs = _observer;
    final result = widget.builder();
    if (!_observer.canUpdate) {
      throw """
      [Get] the improper use of a GetX has been detected. 
      You should only use GetX or Obx for the specific widget that will be updated.
      If you are seeing this error,you probably did not insert any observable variables into GetX/Obx 
      or insert them outside the scope that GetX considers suitable for an update 
      (example: GetX => HeavyWidget => variableObservable).
      If you need to update a parent widget and a child widget,wrap each one in an Obx/GetX.
      """;
    }
    getObs = observer;
    return result;
  }

构建时,RxString() 将执行 get value,和 addListen()

代码是

  set value(T val) {
    if (_value == val && !firstRebuild) return;
    firstRebuild = false;
    _value = val;
    subject.add(_value);
  }

  /// Returns the current [value]
  T get value {
    if (getObs != null) {
      getObs.addListener(subject.stream);
    }
    return _value;
  }

void addListener(Stream<T> rxGetx) {
    if (_subscriptions.containsKey(rxGetx)) {
      return;
    }
    _subscriptions[rxGetx] = rxGetx.listen((data) {
      subject.add(data);
    });
  }

所以他们建立了联系

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-