【问题标题】:Kotlin safe call (?.) implementationKotlin 安全调用 (?.) 实现
【发布时间】:2019-12-17 22:19:33
【问题描述】:

我可以用繁琐的方法来解决它,所以如果您不发布解决方法而是记录解决方案,我将不胜感激。

我正在尝试将以下代码 sn-p 添加到片段的 onCreateView() 中,但是“感谢”安全调用(或我的代码设计)事情变得复杂了。 AfterTabLayoutMediator(activity 部分 Kotlin 显示在 activity 之后添加安全调用 (?.) 的警告(相当于 Java 中的 getActivity),可能是 null

尝试任何解决方案之前的原始代码sn-p

TabLayoutMediator(activity.findViewById(R.id.tabs), view.findViewById(R.id.view_pager),
                TabLayoutMediator.OnConfigureTabCallback { tab, position ->
                    // Styling each tab here
                    tab.text = mValueHeadlineCategoryList[position]
                }).attach()

1) 尝试通过添加safe call解决(失败)

现在添加安全调用违反了TabLayoutMediator 输入参数,我在TabLayoutMediator 上收到type mismatch Required:TabLayout Found:TabLayout? 警告。

TabLayoutMediator(activity?.findViewById(R.id.tabs), view.findViewById(R.id.view_pager),
            TabLayoutMediator.OnConfigureTabCallback { tab, position ->
                tab.text = mValueHeadlineCategoryList[position]
            }).attach()

2) 尝试在safe call之前通过空检查来解决(失败)

添加空检查,但现在 Kotlin 会在 TabLayoutMediator(activity 部分显示为 Smart cast to 'FragmentActivity' is impossible, because 'activity' is a property that has open or custom gette 的警告

if (activity != null) {
            TabLayoutMediator(activity.findViewById(R.id.tabs), view.findViewById(R.id.view_pager),
                TabLayoutMediator.OnConfigureTabCallback { tab, position ->
                    tab.text = mValueHeadlineCategoryList[position]
                }).attach()
        }

【问题讨论】:

    标签: android kotlin kotlin-null-safety


    【解决方案1】:

    简单修复:你可以这样做

       activity?.let { instance ->
                TabLayoutMediator(instance.findViewById(R.id.tabs), view.findViewById(R.id.view_pager),
                    TabLayoutMediator.OnConfigureTabCallback { tab, position ->
                        tab.text = mValueHeadlineCategoryList[position]
                    }).attach()
    }
    

    【讨论】:

    • 两个答案都很好,但这只是重点,因为我现在不希望 IllegalStateException 被抛出
    【解决方案2】:

    替换activitywith requireActivity()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-20
      • 2017-08-06
      • 2016-04-16
      • 1970-01-01
      • 2014-07-09
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      相关资源
      最近更新 更多