Flutter getx 第一个空值
Flutter getx first null value
亲爱的互联网,您好,感谢您的 getx,
我有一个关于 getx rx flow &/ getx initial 的问题。我是 getx 的新手,但是 rxjs 的老手,你得到的值只在 .next(value)
;
上发出
我的问题是:无论如何 [4] 怎样才能避免发出初始空值?
我的基本理解是 UI 或 widget 上的 Obx()
、Getx<Xyz>()
或 GetBuilder<Xyz>()
只会产生价值。
以下是关于这个问题的一些片段:
来自 [3] Text('' + _identity.value.profile.name))
的这一特定行总是首先导致空 [3],几毫秒后,服务器的响应设置好,一切正常。
那么,如何避免第一个 null 值发射,ergo 异常?因为这是我基于一般 redux 体验的期望。
1: https://github.com/jonataslaw/getx/blob/master/lib/get_rx/src/rx_types/rx_core/rx_impl.dart#L371
2:控制器
final Rx<UserDataProfile> _userDataProfile = UserDataProfile().obs;
[...] after a few seconds milliseconds
_userDataProfile.value(xyzValue);
3: UI
class DetailScreen extends StatelessWidget {
final logger = LoggingService().logger;
@override
Widget build(BuildContext context) {
final dataService = Get.find<DataService>();
final _identity = dataService.identity();
return Scaffold(
appBar: AppBar(
title: Obx(() => Text('' + _identity.value.profile.name)),
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
Get.back();
},
),
),
);
}
}
3:异常
======== Exception caught by widgets library =======================================================
The following NoSuchMethodError was thrown building Obx(dirty, state: _ObxState#b3490):
The getter 'name' was called on null.
Receiver: null
Tried calling: name
4:添加空值检查真的没有意义,这只是 - 恕我直言 - 不是 redux 的方式。
文本不能为空值,您应该使用 ?.name
来防止这种情况,如果为空,则提供默认值,例如:
class DetailScreen extends StatelessWidget {
final logger = LoggingService().logger;
@override
Widget build(BuildContext context) {
final dataService = Get.find<DataService>();
final _identity = dataService.identity();
return Scaffold(
appBar: AppBar(
title: Obx(() => Text('' + (_identity.value.profile?.name ?? ''))), // here
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
Get.back();
},
),
),
);
}
}
或添加默认值以防止空值:
Rx<UserDataProfile> _userDataProfile = UserDataProfile(name: '').obs;
关于如何实现这一点,我能找到的最好方法是混合使用 getx and rx_widgets
你可以抓住code here on github
亲爱的互联网,您好,感谢您的 getx,
我有一个关于 getx rx flow &/ getx initial 的问题。我是 getx 的新手,但是 rxjs 的老手,你得到的值只在 .next(value)
;
我的问题是:无论如何 [4] 怎样才能避免发出初始空值?
我的基本理解是 UI 或 widget 上的 Obx()
、Getx<Xyz>()
或 GetBuilder<Xyz>()
只会产生价值。
以下是关于这个问题的一些片段:
来自 [3] Text('' + _identity.value.profile.name))
的这一特定行总是首先导致空 [3],几毫秒后,服务器的响应设置好,一切正常。
那么,如何避免第一个 null 值发射,ergo 异常?因为这是我基于一般 redux 体验的期望。
1: https://github.com/jonataslaw/getx/blob/master/lib/get_rx/src/rx_types/rx_core/rx_impl.dart#L371
2:控制器
final Rx<UserDataProfile> _userDataProfile = UserDataProfile().obs;
[...] after a few seconds milliseconds
_userDataProfile.value(xyzValue);
3: UI
class DetailScreen extends StatelessWidget {
final logger = LoggingService().logger;
@override
Widget build(BuildContext context) {
final dataService = Get.find<DataService>();
final _identity = dataService.identity();
return Scaffold(
appBar: AppBar(
title: Obx(() => Text('' + _identity.value.profile.name)),
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
Get.back();
},
),
),
);
}
}
3:异常
======== Exception caught by widgets library =======================================================
The following NoSuchMethodError was thrown building Obx(dirty, state: _ObxState#b3490):
The getter 'name' was called on null.
Receiver: null
Tried calling: name
4:添加空值检查真的没有意义,这只是 - 恕我直言 - 不是 redux 的方式。
文本不能为空值,您应该使用 ?.name
来防止这种情况,如果为空,则提供默认值,例如:
class DetailScreen extends StatelessWidget {
final logger = LoggingService().logger;
@override
Widget build(BuildContext context) {
final dataService = Get.find<DataService>();
final _identity = dataService.identity();
return Scaffold(
appBar: AppBar(
title: Obx(() => Text('' + (_identity.value.profile?.name ?? ''))), // here
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
Get.back();
},
),
),
);
}
}
或添加默认值以防止空值:
Rx<UserDataProfile> _userDataProfile = UserDataProfile(name: '').obs;
关于如何实现这一点,我能找到的最好方法是混合使用 getx and rx_widgets
你可以抓住code here on github