GetX + 开关
这是在 StatelessWidget 中使用带有 Switch 小部件的 GetX 的复制/粘贴示例。
import 'package:flutter/material.dart';
import 'package:get/get.dart';
/// GetX Controller for holding Switch's current value
class SwitchX extends GetxController {
RxBool on = false.obs; // our observable
// swap true/false & save it to observable
void toggle() => on.value = on.value ? false : true;
}
/// Stateless Page here
class SwitchGetxPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
SwitchX sx = Get.put(SwitchX()); // Instantiate Get Controller, *in* build()
return Scaffold(
appBar: AppBar(
title: Text('Switch Field'),
),
body: SafeArea(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// Obx will rebuild Text & Switch when "on" observable changes
Obx(() => Text('Switch Setting: ${sx.on}')),
Obx(() => Switch(
onChanged: (val) => sx.toggle(),
value: sx.on.value),
)
],
),
),
),
);
}
}
GetX + 状态
使用 GetX,您不需要 StatefulWidgets,因为您在小部件之外保持“状态”,而在 GetxController 内部保持“状态”。
在上面的示例中,RxBool on = false.obs 是您的应用程序的“状态”。在您的应用程序的整个生命周期中,它将是 true 或 false。
当Switch's 的值发生变化时,您需要重建任何小部件,将它们放入Obx、GetX 或GetBuilder 并使用可观察变量。
Obx、GetX 将在其可观察到的变化时重建自己。 GetBuilder 需要您调用 update() 才能重建它。就像setState() 电话一样。
为什么示例中有两个Obx?
为了让Obx/GetX 必须直接包装一个可观察变量,这一点非常明显。
GetX 要求您直接在 Obx/GetX 中使用可观察变量,而不是像在孩子的孩子中那样进一步嵌套。
例如,下面这个,会抛出一个错误:
class SwitchGetxPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
SwitchX sx = Get.put(SwitchX());
return Scaffold(
appBar: AppBar(
title: Text('Switch Field'),
),
body: SafeArea(
child: Center(
child: Obx(() => MyTextSwitch(sx)), // don't do this, will explode
),
),
);
}
}
class MyTextSwitch extends StatelessWidget {
final SwitchX sx;
MyTextSwitch(this.sx);
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Switch Setting: ${sx.on}'),
Switch(
onChanged: (val) => sx.toggle(),
value: sx.on.value)
],
);
}
}
下面的这个版本仍然可以,但没有在第一个示例中使用,因为它可能会导致不良习惯(例如重建不需要它的小部件)和上面示例中的错误。请记住,Obx/GetX 的子项中必须有一个 observable:
class SwitchGetxPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
SwitchX sx = Get.put(SwitchX());
return Scaffold(
appBar: AppBar(
title: Text('Switch Field'),
),
body: SafeArea(
child: Center(
child: Obx( // still OK, but rebuilds Column unnecessarily
() => Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Switch Setting: ${sx.on}'),
Switch(
onChanged: (val) => sx.toggle(),
value: sx.on.value)
],
),
),
),
),
);
}
}