Как устранить ошибку: Несоответствие типов: предполагаемый тип-строка? но Струна была ожидаема

#string #flutter #kotlin #flutter-method-channel

Вопрос:

У меня такая ошибка: «Несоответствие типа: предполагаемый тип-строка? но Струна была ожидаема»

Вот моя функция:

 fun updateIcon(name: String) {
        val context = MainActivity.appContext
        val packageName: String = context.getPackageName()
        val className: String = String.format("%s.%s", packageName, name)
        val oldName: Array<ActivityInfo>? = getActivities()
        val pm: PackageManager = context.getPackageManager()
        pm.setComponentEnabledSetting(ComponentName(packageName, className), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP)

        for(activity: ActivityInfo in oldName.orEmpty()) {
            if(!activity.name.equals(className)) {
                pm.setComponentEnabledSetting(ComponentName(packageName, activity.name), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)
            }
        }
    }
 

Вот где я его использую:

 val channelChangeAppIcon = "flutter.native/channelChangeAppIcon"       
        MethodChannel(flutterEngine.dartExecutor, channelChangeAppIcon).setMethodCallHandler { call, result ->
            if (call.method == "updateIcon") {
                try {
                    val str: String = call.argument<String>("name")
                    updateIcon(str) // here
                    result.success(true)
                } catch (e: Exception) {
                    e.printStackTrace()
                }
            } else {
                result.notImplemented()
            }
        }
 

Заранее спасибо.

Ответ №1:

Прежде чем обращаться к аргументу « name , сначала проверьте, существует ли он. это можно сделать следующим образом

 if(call.hasArgument("name")){
   val str: String = call.argument<String>("name")
   updateIcon(str)
   result.success(true)
}
 

Комментарии:

1. спасибо за ваш ответ, но ошибка все еще остается? Есть ли другое решение?

Ответ №2:

Пожалуйста, добавьте взрыв ! оператору предстоит решить.

 val channelChangeAppIcon = "flutter.native/channelChangeAppIcon"       
    MethodChannel(flutterEngine.dartExecutor, channelChangeAppIcon).setMethodCallHandler { call, result ->
        if (call.method! == "updateIcon") {
            try {
                val str: String = call.argument<String>("name")
                updateIcon(str) // here
                result.success(true)
            } catch (e: Exception) {
                e.printStackTrace()
            }
        } else {
            result.notImplemented()
        }
    }
 

Оператор взрыва не делает ничего, кроме как говорит Дарту, что даже если мы определили некоторую переменную как тип, допускающий значение Null, она определенно не будет нулевой.

Обнуляемая безопасность и анализ потока Dart предназначены для того, чтобы облегчить жизнь разработчику, избегая ошибок во время выполнения и обнаруживая их во время компиляции.

Комментарии:

1. Спасибо за ваш ответ, но, к сожалению, ошибка все еще остается. Есть ли какое-то другое решение?