【问题标题】:Flutter getx first null valueFlutter getx 第一个空值
【发布时间】:2021-06-30 04:02:38
【问题描述】:

亲爱的互联网,您好,感谢您的 getx,

我有一个关于 getx rx flow &/ getx initial 的问题。我是 getx 的新手,但是是 rxjs 的老手,你会得到一个只在 .next(value) 上发出的值;

我的问题是:如何——无论如何[4]——避免初始空值的发射? 我的基本理解是,在 UI 或小部件上,Obx()Getx<Xyz>()GetBuilder<Xyz>() 只会在值发射上。

这里有一些关于这个问题的sn-ps:

来自 [3] Text('' + _identity.value.profile.name)) 的这一特定行总是首先导致 null [3],几毫秒后,服务器的响应被设置,一切都很好。 那么,如何避免第一个空值发射,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:用户界面

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 的方式。

【问题讨论】:

    标签: flutter dart rxdart flutter-getx


    【解决方案1】:

    我能找到的关于如何实现这一点的最佳方法是混合使用 getxrx_widgets

    你可以抢code here on github

    【讨论】:

      【解决方案2】:

      文本不能被赋予空值,您应该使用?.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;
      

      【讨论】:

      • 可以肯定地进行空值检查,但我的问题是如何避免这种首先总是发生初始空值发射。
      猜你喜欢
      • 2021-11-16
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 2022-01-08
      • 2021-11-11
      • 2021-12-20
      • 2021-04-14
      • 2022-08-04
      相关资源
      最近更新 更多