Kotlin Bundle.putString явно не добавляет «String», но вместо этого «String?» - PullRequest
2 голосов
/ 23 марта 2020
val args = Bundle()
args.putString("type", details.type)

navigator.navigate(context!!, findNavController(), Destination.TYPE, args)

Я не совсем понимаю, почему в получающем фрагменте, когда я go обращаюсь к аргументам, через которые он прошел, он отвечает ...

val type: String = arguments.getString("type")

arguments.getString все подчеркнуто красным и говорит "Обязательная строка найдена строка?" Но как, когда я вызвал метод "putString"?!?

Это приводит к тому, что текст не отображается в новом фрагменте, и я предполагаю, что это проблема обнуляемости.

Ответы [ 4 ]

0 голосов
/ 23 марта 2020

Подпись метода для getString() возвращает пустую строку. Это связано с тем, что во время компиляции компилятор не может знать, существует ли значение в пакете или нет. У вас будет та же проблема при получении чего-либо с любой карты.

Если вы точно знаете, что значение в комплекте или карте должно существовать во время вызова getString(), вы можете использовать оператор !!. Вот для чего это. Когда вы знаете, что-то всегда должно быть там, целесообразно, чтобы было сгенерировано исключение (в данном случае KNPE), если его там нет, чтобы вы могли легко найти любую ошибку программирования во время тестирования.

isEmpty() или ?.let не помогают в данном конкретном случае, поскольку они просто маскируют ошибку программирования и затрудняют ее обнаружение или отладку.

0 голосов
/ 23 марта 2020

Для безопасного чтения строки вы можете использовать:

val type: String = arguments?.getString("type").orEmpty()

Вызов orEmpty в конце гарантирует, что верная строка возвращается, даже если arguments или getString() возвращает ноль.

0 голосов
/ 23 марта 2020

Это вопрос знаний, которые доступны в получении Fragment.

. Fragment не знает, как его arguments были созданы (или изменены), поэтому он должен предполагать, что ключ "type", который вы ищете, может отсутствовать в аргументах Bundle. Вот почему он возвращает результат nullable (String?) (значение null будет означать отсутствует в аргументах).

Ваш фрагмент может быть создан во многих местах в вашем приложении и его аргументы могли быть изменены во многих местах. Мы не можем отследить это.


Существуют различные решения этой проблемы, в зависимости от вашего подхода к другим частям кода и от того, насколько «вы уверены» в создании своего Fragment.

Обычно я выбираю решение, в котором я предполагаю, что установка type равна обязательна . Поэтому если type отсутствует - я быстро проваливаюсь. Это означало бы, что Fragment было использовано не по назначению.

val type: String = arguments!!.getString("type")!!

Приведенный выше код вызовет sh, если либо:

a) arguments не было установлено, либо

b) String с type не было введено в arguments Bundle.

0 голосов
/ 23 марта 2020

Вы правы, это проблема нулевой способности.

Сначала вы должны быть уверены, что ожидаете значение, поэтому попробуйте добавить "?" или "!!", я бы порекомендовал "?" или go с блоком if {} else

...