将支持库更新到27.0.0后,我的片段中出现多个错误

hum*_*zed 22 android android-fragments kotlin android-support-library

将支持库从v-26.1.0更新到v-27.0.0后,我的片段中出现多个错误.

这里列出了一些错误:

错误:智能转换为'Bundle'是不可能的,因为'arguments'是一个可变属性,此时可能已被更改.

错误:'onCreateView'不会覆盖任何内容

错误:'onViewCreated'不会覆盖任何内容

错误:类型不匹配:推断类型是View?但是View是预期的

错误:类型不匹配:推断类型是上下文?但是上下文是预期的

错误:类型不匹配:推断类型是FragmentActivity?但是上下文是预期的

错误:类型不匹配:推断类型是FragmentActivity?但是上下文是预期的

来自android studio的空片段模板.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    if (arguments != null) {
        mParam1 = arguments.getString(ARG_PARAM1)
        mParam2 = arguments.getString(ARG_PARAM2)
    }
}

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    return inflater!!.inflate(R.layout.fragment_blank, container, false)
}

override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
}
Run Code Online (Sandbox Code Playgroud)

hum*_*zed 38

所有这些错误的根本原因是,在支持库V-27.0.0 @Nullable@NonNull注释已被添加.
并且由于kotlin语言意识到可空性,Nullable并且NonNull与Java 不同,因此具有不同的类型.
没有这些注释,编译器无法区分它们,Android工作室正在尽力推断出正确的类型.

TL; DR:更改类型以正确反映可空性状态.


错误:智能转换为'Bundle'是不可能的,因为'arguments'是一个可变属性,此时可能已被更改.

改变arguments.getString(ARG_NAME)==>arguments?.getString(ARG_NAME) ?: ""


错误:'onCreateView'不会覆盖任何内容

CHANE:

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View?
Run Code Online (Sandbox Code Playgroud)

==>

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View?
Run Code Online (Sandbox Code Playgroud)

错误:'onViewCreated'不会覆盖任何内容

更改:

override fun onViewCreated(view: View?, savedInstanceState: Bundle?)
Run Code Online (Sandbox Code Playgroud)

==>

override fun onViewCreated(view: View, savedInstanceState: Bundle?)
Run Code Online (Sandbox Code Playgroud)

错误:类型不匹配:推断类型是上下文?但是上下文是预期的

如果上下文作为参数传递给方法,只需要用速战速决,以取代getContext()getContext()?.let{}
同样适用于科特林短版context.

else if用于调用某些方法替换getContext().someMethod()getContext()?.someMethod()

这同样适用于kotlin短版context?.someMethod().


错误:类型不匹配:推断类型是FragmentActivity?但是上下文是预期的

使用上一个错误的修复程序.

  • 将`?.let {}`添加到片段的活动中不允许我将其用作方法的参数.错误是`类型不匹配:推断类型是FragmentActivity?但是上下文是预期的.还有其他人这样做吗?此外,当我尝试访问`cacheDir`时,我得到另一个:`智能转换为'FragmentActivity'是不可能的,因为'activity'是一个具有开放或自定义getter`的属性.仍然要找到如何解决这个问题. (5认同)