科特林的举止奇怪

时间:2019-06-06 15:06:01

标签: android

考虑以下代码:

1     domesticUsage?.run {
2         items.add(DelimiterListItem())
3         items.add(SpacerListItem(resources.getDimensionPixelSize(R.dimen.vertical_margin)))
4         if (title.isNotEmpty()) {
5             items.add(SubscriptionHeaderViewListItem(title, Gravity.CENTER_HORIZONTAL))
6         }
7         
8         usage1?.let { mainUsageDataList.add(it) }
9         usage2?.let { mainUsageDataList.add(it) }
10        if (mainUsageDataList.isNotEmpty()) {
11            items.add(SubscriptionUsageStatListItem(mainUsageDataList))
12        }
13        
14        extra?.run {
15            items.add(SideExtraBannerListItem(title, subtitle))
16        }
17    
18    } ?: items.add(ErrorReloadListItem(ErrorType.NO_DATA_MOBILE))

我的问题很简单: 如果extra(第14行)为null,那么我希望这是该代码段中最后执行的行,但是调试时会发生的情况是它会跳回到第1行,然后跳回到第{ {1}}从而执行18视图。

这不应该发生,对吧?仅当ErrorReload行中的ErrorReload为空时,才应该添加domesticUsage视图,对吗?

我在这里想念什么?

顺便说一下,编辑器在行1的末尾显示此^run。这意味着什么? enter image description here

1 个答案:

答案 0 :(得分:0)

我的意图是使用letrun作为验证非空操作的一种较短方法,但是看起来像嵌套那些以我做的方式造成的危害更大,那就好了,所以我结束了回到旧的!= null方式:

domesticUsage?.run {
    items.add(DelimiterListItem())
    items.add(SpacerListItem(resources.getDimensionPixelSize(R.dimen.vertical_margin)))

    if (title.isNotEmpty()) {
        items.add(SubscriptionHeaderViewListItem(title, Gravity.CENTER_HORIZONTAL))
    }

    if (usage1 != null)
        mainUsageDataList.add(usage1)

    if (usage2 != null)
        mainUsageDataList.add(usage2)

    if (mainUsageDataList.isNotEmpty()) {
        items.add(SubscriptionUsageStatListItem(mainUsageDataList))
    }

    if (extra != null)
        items.add(SideExtraBannerListItem(extra.title, extra.subtitle))

} ?: items.add(ErrorReloadListItem(ErrorType.NO_DATA_MOBILE))

如果有人想评论一种更简短的方法,而不会导致错误视图的意外添加,我将很高兴看到这一点。