- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用以下包https://pub.dev/packages/get .我需要在 GetxController 的 onClose 中关闭我的 .obs 吗?我在文档中找不到任何关于此的内容。看着我的内存,似乎它们正在被自动销毁。
最佳答案
到目前为止,我对 GetX + Flutter 的理解...
不,您不必删除 close()
中的 .obs GetxControllers 的方法。当 Controller 从内存中删除时, Controller 中的可观察对象的处理会自动完成。
当包含它们的小部件从小部件堆栈中弹出/从小部件树中删除时,GetX 会处理/删除 GetxControllers(及其可观察对象) (默认情况下,但可以被覆盖)。
您可以在 dispose()
的覆盖中看到这一点各种 Get 小部件的方法。
这是 dispose()
的片段在 GetX
时运行小部件被弹出/删除:
@override
void dispose() {
if (widget.dispose != null) widget.dispose(this);
if (isCreator || widget.assignId) {
if (widget.autoRemove && GetInstance().isRegistered<T>(tag: widget.tag)) {
GetInstance().delete<T>(tag: widget.tag);
}
}
subs.cancel();
_observer.close();
controller = null;
isCreator = null;
super.dispose();
}
当您使用绑定(bind)或
Get.to()
您正在使用
GetPageRoute
是通过路由名称进行清理的:
@override
void dispose() {
if (Get.smartManagement != SmartManagement.onlyBuilder) {
WidgetsBinding.instance.addPostFrameCallback((_) => GetInstance()
.removeDependencyByRoute("${settings?.name ?? routeName}"));
}
super.dispose();
}
测试应用
import 'package:flutter/material.dart';
import 'package:get/get.dart';
void main() {
// MyCounterBinding().dependencies(); // usually where Bindings happen
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GetMaterialApp(
title: 'GetX Dispose Ex',
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('GetX Dispose Test'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
RaisedButton(
child: Text('GetX/Builder Child'),
onPressed: () => Get.to(ChildPage()),
),
RaisedButton(
child: Text('Get.put Child'),
onPressed: () => Get.to(ChildPutPage()),
),
RaisedButton(
child: Text('Binding Child'),
onPressed: () => Get.to(ChildBindPage()),
),
],
),
),
);
}
}
/// GETX / GETBUILDER
/// Creates Controller within the Get widgets
class ChildPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('GetX Dispose Test Counter'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Text('This is the Child Page'),
GetX<ChildX>(
init: ChildX(),
builder: (cx) => Text('Counter: ${cx.counter}', style: TextStyle(fontSize: 20),),
),
GetBuilder<ChildX>(
init: ChildX(),
builder: (cx) => RaisedButton(
child: Text('Increment'),
onPressed: cx.inc,
),
),
],
),
),
);
}
}
/// GET.PUT
/// Creates Controller instance upon Build, usable anywhere within the widget build context
class ChildPutPage extends StatelessWidget {
//final ChildX cx = Get.put(ChildX()); // wrong place to put
// see https://github.com/jonataslaw/getx/issues/818#issuecomment-733652172
@override
Widget build(BuildContext context) {
final ChildX cx = Get.put(ChildX());
return Scaffold(
appBar: AppBar(
title: Text('GetX Dispose Test Counter'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Text('This is the Child Page'),
Obx(
() => Text('Counter: ${cx.counter}', style: TextStyle(fontSize: 20),),
),
RaisedButton(
child: Text('Increment'),
onPressed: cx.inc,
)
],
),
),
);
}
}
class MyCounterBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut(() => ChildX(), fenix: true);
}
}
/// GET BINDINGS
/// Normally the MyCounterBinding().dependencies() call is done in main(),
/// making it available throughout the entire app.
/// A lazyPut Controller /w [fenix:true] will be created/removed/recreated as needed or
/// as specified by SmartManagement settings.
/// But to keep the Bindings from polluting the other examples, it's done within this
/// widget's build context (you wouldn't normally do this.)
class ChildBindPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
MyCounterBinding().dependencies(); // just for illustration/example
return Scaffold(
appBar: AppBar(
title: Text('GetX Dispose Test Counter'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Text('This is the Child Page'),
Obx(
() => Text('Counter: ${ChildX.i.counter}', style: TextStyle(fontSize: 20),),
),
RaisedButton(
child: Text('Increment'),
onPressed: ChildX.i.inc,
)
],
),
),
);
}
}
class ChildX extends GetxController {
static ChildX get i => Get.find();
RxInt counter = 0.obs;
void inc() => counter.value++;
}
笔记
Get.put()
时在子小部件中确保您使用的是
Get.to()
导航到那个 child 而不是 Flutter 的内置
Navigator.push
.
GetPageRoute
中。使用
Get.to
时.当导航离开/将小部件从堆栈中弹出时,此 Route 类将处理此路由中的 Controller 。如果您使用
Navigator.push
, GetX 不参与,你不会得到这个自动清理。
onPressed: () => Navigator.push(context, MaterialPageRoute(
builder: (context) => ChildPutPage())),
前往
onPressed: () => Get.to(ChildPutPage()),
关于flutter - GetxControllers 是否会自动关闭 obs 流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62990128/
我是 Flutter 的新手,所以使用 GetX https://pub.dev/packages/get 我是否能够访问来自 另一个 Controller 中的值 Controller ? 它们都将
我是 tdd 的初学者,所以如果这是一个愚蠢的问题,请原谅我。 我在对 GetxControllers 进行单元测试时遇到困难。有谁知道这样做的简单方法? 每当我这样做时,我都会收到错误,因为 Get
目前,我的应用程序在使用 Flutter 的 get 包 ( https://pub.dev/packages/get ) 和以下状态场景时遇到很多问题: 例如,我有一个 GetxController
我正在为我的新项目尝试 GetX,并尝试使用受启发的 AnimationController this comment . Tween -> blur & spread & AnimationCont
我正在使用以下包https://pub.dev/packages/get .我需要在 GetxController 的 onClose 中关闭我的 .obs 吗?我在文档中找不到任何关于此的内容。看着
我有这门课并使用“响应式(Reactive)”状态管理,例如 "".obs 现在我计划从本地存储初始化我的状态(get_storage)onInit() 问题: 我在哪里保存我的数据?一旦某些状态发生
我是一名优秀的程序员,十分优秀!