当我使用 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() 怎么知道什么时候登录?
请帮帮我。
答案 0 :(得分:6)
您可以使用 Get 中的 Obx
或 GetX
小部件来“监听”您在 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++;
}
obs
的变量(如 count.obs
和 log2.obs
)处理流和订阅。当您想“聆听”或“观察”时,请使用 Obx
或 GetX
小部件。这些会自动侦听其子项的 obs
更改,并在更改时重建。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('Add +1'),
onPressed: c.change,
),
RaisedButton(
child: Text('Update GetBuilder'),
onPressed: c.update, // rebuild GetBuilder widget
),
],
),
),
),
);
}
}
class Controller extends GetxController {
RxInt log2 = 0.obs;
void change() => log2.value++;
}
监听可观察到的 (obs
) 变化。控制器需要已经在其他地方声明/初始化才能使用。
监听可观察到的 (obs
) 变化。如果没有在其他地方完成,可以使用 init:
构造函数参数初始化控制器本身。可选参数。如果 Controller 已经实例化,则可以安全地使用 init:
。将连接到现有实例。
是否不听取obs
的变化。必须由您手动重建,调用 controller.update()
。类似于 setState()
调用。如果没有在其他地方完成,可以使用 init:
参数初始化控制器本身。可选。
答案 1 :(得分:0)
首先:
when I "".obx.value="newString".why Rx() can know.
这是错误的,.obx 不存在,我猜你是说 .obs;
当你创建一个像 final a = ''.obs
这样的 OBS 变量时,这个变量的类型将是一个 RxString(),所以你可以使用任何你想要的观察这个变量。
我知道您可以使用两个小部件来观察您的屏幕:
GetX(), Obx()
答案 2 :(得分:0)
见链接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);
});
}
所以他们建立了联系