【问题标题】:Using safeargs I get "required Bundle found Bundle?"使用 safeargs 我得到“找到所需的捆绑包?”
【发布时间】:2019-01-31 15:08:21
【问题描述】:

我正在使用 safeargs 传递参数。在接收片段中,我收到编译错误:'Required Bundle Found Bundle?'。看不到错误出现在哪里。

谷歌搜索,检查文本和 udacity 教程

出现错误的地方(在“参数”处)

package com.example.android.naveditoryoutube

import android.arch.lifecycle.ViewModelProviders
import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import kotlinx.android.synthetic.main.fragment_two_fragment.*

class FragmentTwo : Fragment() {

    companion object {
        fun newInstance() = FragmentTwo()
    }

    private lateinit var viewModel: FragmentTwoViewModel

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

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(this).get(FragmentTwoViewModel::class.java)

    }

    override fun onStart() {
        super.onStart()
        var args = FragmentTwoArgs.fromBundle(arguments)
        argText.text = args.calculated_Number
    }

}

发送代码:

package com.example.android.naveditoryoutube

import android.arch.lifecycle.ViewModelProviders
import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import androidx.navigation.Navigation
import kotlinx.android.synthetic.main.fragment_one_fragment.*


class FragmentOne : Fragment() {


    companion object {
        fun newInstance() = FragmentOne()
    }

    private lateinit var viewModel: FragmentOneViewModel


    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {



        return inflater.inflate(R.layout.fragment_one_fragment, container, false)

    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(this).get(FragmentOneViewModel::class.java)

        var calculated_Number : String = viewModel.sendNewNumber().toString()

        button_calculate.setOnClickListener{view: View ->
            if (number_box.text.isNotEmpty()){
                var number_entered: String = number_box.text.toString()
                viewModel.findNewNumber((number_entered))
                calculated_Number = viewModel.sendNewNumber()
               Navigation.findNavController(view).navigate(FragmentOneDirections.actionFragmentOneToFragmentTwo(calculated_Number))
            }


        }
    }

}

此处出现错误 var args = FragmentTwoArgs.fromBundle(参数)

arguments 应该是 Bundle 但是 Bundle?

【问题讨论】:

  • 什么是 FragmentTwoArgs?
  • arguments 可以为空,并且他们期望非空。是时候解决它了!
  • FragmentTwoArgs 已设置(在生成的 java 文件夹中)当我在 gradle 文件中发布以下行时:classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0- alpha11" 并应用插件:'androidx.navigation.safeargs'

标签: android kotlin navigation android-safe-args


【解决方案1】:

我必须更改它才能使用!

var args = FragmentTwoArgs.fromBundle(arguments!!)

【讨论】:

  • 感谢您的回答 - 如果上述解决方案不起作用,我会尝试
  • 如果导航操作有时没有参数包,这就是您所需要的。
【解决方案2】:

使用requireArguments() 而不是arguments!!

【讨论】:

  • 您能解释一下它的作用以及为什么首选它吗?
  • developer.android.com/reference/androidx/fragment/app/… 检查这个。但是,如果您将安全 args 与 nav 组件一起使用,则有一个更好的选择,只需创建一个属性并像这样 val args 初始化它:FragmentArgs by navArgs()
【解决方案3】:

尝试使用 requireArguments() 代替参数

var args = FragmentTwoArgs.fromBundle(requireArguments())

【讨论】:

    【解决方案4】:

    你不应该使用FragmentTwoArgs.fromBundle(arguments) 只需使用:

    val args: FragmentTwoArgsby navArgs()
    

    在你的方法调用中:

    val amount = args.amount
    

    这对我有用,请参阅官方指南: https://developer.android.com/topic/libraries/architecture/navigation/navigation-pass-data

    【讨论】:

    • 嗨 Dmitry - 编译错误已经消失 - 非常感谢
    • 使用 navArgs() 需要 -ktx 依赖项,如果您不使用它们(例如纯 Java 项目),那么方法是 getArguments() 。此外,对于navArgs(),'by' 关键字是必需的...
    【解决方案5】:

    代替

    var args = FragmentTwoArgs.fromBundle(arguments) argText.text = args.calculated_Number

    你可以使用

    arguments?.let {
                      val args = FragmentTwoArgs.fromBundle(it)
                      argText.text = args.calculated_Number
                }
    

    【讨论】:

      猜你喜欢
      • 2014-05-06
      • 2019-09-01
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多