0

I have an error like this: "Type mismatch: inferred type is String? but String was expected"

Here is my function:

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

Here is where i use it:

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

Thanks in advance.

mightyWOZ
  • 7,946
  • 3
  • 29
  • 46
chuanpham
  • 112
  • 1
  • 9

2 Answers2

0

Before accessing the argument 'name', first check if it exists. this can be done as

if(call.hasArgument("name")){
   val str: String = call.argument<String>("name")
   updateIcon(str)
   result.success(true)
}
mightyWOZ
  • 7,946
  • 3
  • 29
  • 46
0

Please add bang ! operator to resolve.

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

The Bang operator does nothing more than telling Dart that even if we have defined some variable as a Nullable type, it will definitely not be null.

Dart's Nullable safety and Flow Analysis are here to make developer's life easy by avoiding runtime error and catching them at compiletime itself.