导航组件:可打包参数但出现错误类型不匹配:推断类型为 Student 但应为 String
Navigation component: parcelable argument but get error Type mismatch: inferred type is Student but String was expected
在我的根 build.gradle 我有 navigation-safe-args-gradle-plugin
版本 2.2.0-rc03
:
script{
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'androidx.navigation:navigation-safe-args-gradle-plugin:2.2.0-rc03'
}
}
在我的导航图中xml:
<fragment
android:id="@+id/MyListFragment"
android:name="com.foo.bar.ui.mylist.MyListFragment"
android:label="My List">
<action
android:id="@+id/action_myListFragment_to_myDetailFragment"
app:destination="@id/myDetailFragment" />
<!--Here I pass parcelable type as argument-->
<argument
android:name="Student"
app:argType="com.foo.core.model.Student"/>
</fragment>
Student
是正常的 class.
package com.foo.core.model
@Parcelize
data class Student(val studentNumber: Int): Parcelable
在我的片段中我这样做:
val student:Student=Student(123)
findNavController().navigate(actionMyListFragmentToMyDetailFragment(student))
当我构建我的项目时,出现编译器错误:
Type mismatch: inferred type is Student but String was expected
这是为什么?
把你的 argument
放在 MyDetailsFragment 而不是 MyListFragment 所以
MyListFragment
<fragment
android:id="@+id/MyListFragment"
android:name="com.foo.bar.ui.mylist.MyListFragment"
android:label="My List">
<action
android:id="@+id/action_myListFragment_to_myDetailFragment"
app:destination="@id/MyDetailsFragment" />
</fragment>
MyDetailsFragment
<fragment
android:id="@+id/MyDetailsFragment"
android:name="com.foo.bar.ui.mylist.MyDetailsFragment"
android:label="My Details">
<argument
android:name="Student"
app:argType="com.foo.core.model.Student"/>
</fragment>
在我的根 build.gradle 我有 navigation-safe-args-gradle-plugin
版本 2.2.0-rc03
:
script{
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'androidx.navigation:navigation-safe-args-gradle-plugin:2.2.0-rc03'
}
}
在我的导航图中xml:
<fragment
android:id="@+id/MyListFragment"
android:name="com.foo.bar.ui.mylist.MyListFragment"
android:label="My List">
<action
android:id="@+id/action_myListFragment_to_myDetailFragment"
app:destination="@id/myDetailFragment" />
<!--Here I pass parcelable type as argument-->
<argument
android:name="Student"
app:argType="com.foo.core.model.Student"/>
</fragment>
Student
是正常的 class.
package com.foo.core.model
@Parcelize
data class Student(val studentNumber: Int): Parcelable
在我的片段中我这样做:
val student:Student=Student(123)
findNavController().navigate(actionMyListFragmentToMyDetailFragment(student))
当我构建我的项目时,出现编译器错误:
Type mismatch: inferred type is Student but String was expected
这是为什么?
把你的 argument
放在 MyDetailsFragment 而不是 MyListFragment 所以
MyListFragment
<fragment
android:id="@+id/MyListFragment"
android:name="com.foo.bar.ui.mylist.MyListFragment"
android:label="My List">
<action
android:id="@+id/action_myListFragment_to_myDetailFragment"
app:destination="@id/MyDetailsFragment" />
</fragment>
MyDetailsFragment
<fragment
android:id="@+id/MyDetailsFragment"
android:name="com.foo.bar.ui.mylist.MyDetailsFragment"
android:label="My Details">
<argument
android:name="Student"
app:argType="com.foo.core.model.Student"/>
</fragment>