3
votes

En utilisant safeargs, j'obtiens "Bundle requis Bundle trouvé?"

Je passe des arguments en utilisant safeargs. Dans le fragment de réception, j'obtiens une erreur de compilation: «Bundle requis Bundle trouvé?». Impossible de voir où l'erreur s'est glissée.

J'ai parcouru Google, vérifié le texte et le didacticiel udacity

Où l'erreur apparaît (au niveau des arguments)

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))
            }


        }
    }

}

Envoi du code:

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
    }

}

Une erreur apparaît ici var args = FragmentTwoArgs.fromBundle (arguments)

Les arguments sont censés être Bundle, mais Bundle?


3 commentaires

Qu'est-ce que FragmentTwoArgs?


arguments est nullable et ils attendent non-null. Il est temps de le résoudre !!


FragmentTwoArgs a été configuré (dans le dossier java généré) lorsque j'ai publié les lignes suivantes dans les fichiers gradle: classpath "android.arch.navigation: navigation-safe-args-gradle-plugin: ‌ 1.0.0-alpha11" ET appliquer le plugin: «androidx.navigation.safeargs»


5 Réponses :


4
votes

J'ai dû le changer pour l'utiliser !!

var args = FragmentTwoArgs.fromBundle (arguments !!)


2 commentaires

Merci pour la réponse - j'essaierai si la solution ci-dessus ne fonctionne pas


C'est ce dont vous avez besoin si l'action de navigation n'a parfois pas de bundle d'arguments.



0
votes

Vous ne devez pas utiliser FragmentTwoArgs.fromBundle (arguments) il suffit d'utiliser:

val amount = args.amount

Et dans votre appel de méthode:

val args: FragmentTwoArgsby navArgs()

Cela fonctionne pour moi, voir le guide officiel: https://developer.android.com/topic/libraries/ architecture / navigation / navigation-pass-data


2 commentaires

Salut Dmitry - les erreurs de compilation ont disparu - Merci beaucoup


L'utilisation de navArgs () nécessite des dépendances -ktx, si vous ne les utilisez pas (par exemple, un projet Java uniquement), la méthode est getArguments () . De plus, pour navArgs () , le mot-clé ' by ' est requis ...



0
votes

Au lieu de

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

vous pouvez utiliser

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


0 commentaires

1
votes

utilisez requireArguments () au lieu de arguments !!


0 commentaires

0
votes

essayez d'utiliser requireArguments () au lieu d'arguments

var args = FragmentTwoArgs.fromBundle(requireArguments())


0 commentaires