Flutter2 の空のセキュリティ、アプリの空の値のクラッシュの問題を回避

nullセーフとは

Flutter2 以降、Flutter は構成でデフォルトで null 安全性を有効にし、null チェックを介して型システムにマージします。これにより、開発プロセス中にこれらのエラーをキャッチし、本番環境によって引き起こされるクラッシュを防ぐことができます。

現在、Kotlin、Swift、Rustなどは独自にnull安全に対応しています.Dartはバージョン2.12からnull安全に対応しています.null安全により開発者はnullエラークラッシュを効果的に回避できます.Null安全は重要な部分と言えます. Dart 言語の補完的なもので、型と null 非許容型を区別することで型システムをさらに強化します。

無効な安全上の利点

  • 実行時の null 値を編集時の解析エラーに変えることができます。
  • プログラムの堅牢性を高め、Null によるクラッシュを効果的に回避します。
  • Dart と Flutter の開発トレンドに従い、プログラムのその後の反復に落とし穴を残しません。

航空安全の基礎知識

  • 航空安全の原則
  • null安全導入前後のDart型システムの変化
  • null 許容 (?) 型の使用
  • 遅延初期化の使用 (後期)
  • null アサーション演算子 (!) の使用

航空安全の原則

Dart の null-safe サポートは、次の 3 つのコア原則に基づいています。

  • デフォルトで null 非許容: 変数が null 許容として宣言されていない限り、null 非許容型である必要があります
  • 段階的な移行: 移行する時期と移行するコードの量を自由に選択できます。
  • 完全な信頼性: Dart の null 安全性は非常に信頼性が高く、コンパイル中に多くの最適化が含まれることを意味します
    • 変数が null ではないと型システムが推測した場合、変数が null になることはありません。プロジェクト全体とその他の依存関係を null 安全性に完全に移行すると、健全性のすべての利点 (バグの減少、バイナリのサイズの縮小、実行の高速化) が得られます。 .

null安全導入前後のDart型システムの変化

null 安全性が導入される前の Dart の型システムは次のようになっています。
ここに画像の説明を挿入
これは、以前はすべての型が Null になる可能性があることを意味します。つまり、Null 型はすべての型のサブクラスと見なされていました。null 安全性の導入後:
ここに画像の説明を挿入
最大の変更点は Null 型を分離することです。これは、Null が他の型のサブタイプではなくなったことを意味します。したがって、Null 値が非 Null の変数に渡される場合タイプ、タイプ変換はエラーが報告されます。ヒント: エンプティ セーフティを使用する Flutter や Dart プロジェクトでは、?.、!、late のアプリケーションが多数表示されることがよくあります。以下の分析をご覧ください。

null 許容 (?) 型の使用

? を渡すことができます。型に従って、それに続く変数またはパラメーターが Null を受け入れることを示します。

class CommonModel {
    
    
	String? firstName; //可空的成员变量
	int getNameLen(String? last/*可空的参数*/){
    
    
		int firstLen = firstName?.length ?? 0;
		int lastLen = lastName?.length ?? 0;
		return firstLen + lastLen;
	}
}

Null 可能な変数またはパラメーターは、Dart のスペース回避演算子を通じてアクセスする必要があります。そうしないと、コンパイル エラーがスローされます。

プログラムで null 安全性が有効になっている場合、クラスのメンバー変数は既定で null 非許容であるため、非 null メンバー変数の場合は、その初期化メソッドを指定する必要があります。

class CommonModel {
    
    
	List names=[];//定义时初始化
	final List colors;//在构造方法中初始化
	late List urls;//延时初始化
	CommonModel(this.colors);
{
    
    

遅延初期化の使用 (後期)

定義時に初期化できず、?. の使用を避けたい場合は、遅延初期化が役立ちます。変数 modified by late を使用すると、開発者は初期化のタイミングを選択でき、この変数を使用するときに ?. を使用する必要はありません。

late List urls;//延时初始化
setUrls(List urls){
    
    
	this.urls=urls;
}
int getUrlLen() {
    
    
	return urls.length;
}

遅延初期化はコーディングに便利ですが、不適切に使用すると空の例外が発生する問題が発生するため、使用する場合は、割り当てとアクセスの順序を保証する必要があり、逆にすることはできません。

遅延初期化 (late) の使用パラダイム:
Flutter の State の initState メソッドで初期化された一部の変数は、late を使用した遅延初期化により適しています。initState メソッドは Widget ライフ サイクルで最初に実行されるため、変数が変更された後に初期化されます。遅くまで、使用の利便性を確保できるだけでなく、空の例外を防ぐこともできます。

null アサーション演算子 (!) の使用

変数またはパラメーターが null 許容である可能性を排除する場合、 ! を使用して、null 許容変数またはパラメーターが null 許容ではないことをコンパイラーに伝えることができます。これは、メソッド パラメーターを渡すか、null 許容パラメーターを null 非許容入力パラメーターに渡すのに役立ちます次の場合に特に役立ちます。

Widget get _listView{
    
    
	return ListView(
		children: <Widget>[
		_banner,
		Padding(
			padding: EdgeInsets.formLTRB(7, 4, 7, 4),
			child: LocalNav(localNavList: localNavList),
		),
		if (gridNavModel != null)
			Padding(
				padding: EdgeInset.formLTRB(7, 0, 7, 4),
				child: GriNav(gridNavModel: gridNavModel!)),
			Padding(
				padding: EdgeInsets.formLTRB(7, 0, 7, 4),
				child: SubNav(subNavList: subNavList)),
			if (selesBoxModel != null) 
				Padding(
					padding: EdgeInsets.formLTRB(7, 0, 7, 4),
					child: SalesBox(selesBox: salesBoxModel!)),
		],
	);
}

おすすめ

転載: blog.csdn.net/qq_45455361/article/details/122665183