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?
5 Réponses :
J'ai dû le changer pour l'utiliser !!
var args = FragmentTwoArgs.fromBundle (arguments !!)
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.
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
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 ...
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 }
utilisez requireArguments ()
au lieu de arguments !!
essayez d'utiliser requireArguments () au lieu d'arguments
var args = FragmentTwoArgs.fromBundle(requireArguments())
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»