我们可以使用空安全功能在颤振中执行“非空或返回”吗?

时间:2021-03-24 15:11:52

标签: flutter dart

我正在尝试将 null 安全功能迁移到我的 Flutter 项目中,因为这对我的项目未来有好处。由于我已经有通过 Kotlin 开发 Android 应用程序的经验,我已经习惯了这种空安全功能。但似乎我不能做一件在 Kotlin 中可以做的事情。

user?.name ?? "Unknown"

我注意到在 Dart 中,我可以使用此代码行设置默认值。 现在我正在尝试执行此操作

fun performOrReturn(users: Map<String, User>, id: String) {
    val user = users[id] ?: return //This line

    println("User info gotten : ${user.name}")
}

在 Kotlin 中,我可以执行此操作。如果特定变量为空,我可以让方法返回自身,因此 Kotlin 可以灵活地处理空安全。

所以这就是我想要做的,我的代码中有表格。我想检查该字段中指定的列和行中是否存在数据。

Map<int, List<MyData>> table = Map();

...

int _findDataExisting(int row, int col) {
    List<MyData> data = table[row]; //This is causing problem because table[row] can be null

    //Alternative solution is
    //List<MyData> data = table[row] ?? List.empty();
    //
    //if(data.isEmpty) {
    //    return -1;
    //}
    //

    for(int i = 0; i < data.length; i++) {
        if(data[i].column == col) {
            return i;
        }
    }

    return -1;
}

我想让它返回 -1 而不是初始化默认值,因为它不利于处理内存,并且代码效率低下。

List<MyData> data = map[row] ?? return -1;

我像 Kotlin 一样尝试了下面的 line,但 Dart 似乎无法处理这个。

Dart 中是否有类似的东西?如果特定变量为空,则使其返回方法。

2 个答案:

答案 0 :(得分:0)

不要太花哨。

int _findDataExisting(int row, int col) {
  if (table[row] != null) {
    List<MyData> data = table[row]!;
    for(int i = 0; i < data.length; i++) {
      if(data[i].column == col) {
        return i;
      }
    }
  }
  return -1;
}

答案 1 :(得分:0)

您可以最初将 import android.content.Context import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } private val networkCallback = getNetworkCallBack() private fun getNetworkCallBack(): ConnectivityManager.NetworkCallback { return object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { super.onAvailable(network) Toast.makeText(applicationContext, "Internet is on!", Toast.LENGTH_SHORT).show() } override fun onLost(network: Network) { super.onLost(network) Toast.makeText(applicationContext, "Internet turns off!", Toast.LENGTH_SHORT).show() } } } private fun getConnectivityManager() = applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager private fun getNetworkRequest(): NetworkRequest { return NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) // internet check works without this but need it for WiFi status .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .build() } override fun onResume() { super.onResume() getConnectivityManager().registerNetworkCallback(getNetworkRequest(), networkCallback) } override fun onPause() { super.onPause() getConnectivityManager().unregisterNetworkCallback(networkCallback) } } 声明为 nullable 并让 null 检查自动提升它为不可为 null 的类型,从而避免需要使用 null 断言(data) 之后:

!