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?
argumentsest 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»