簡體   English   中英

模棱兩可的功能在做什么?

[英]What is the ambiguate function doing?

這是 just_audio 示例的 main.dart 文件中的一個函數。 我不明白“歧義”行是怎么回事。 我理解 bang 運算符在這種情況下會強制轉換為“底層類型”,但在這種情況下,我不認為沒有底層類型。 底層類型是<T?> 當我在文檔中將其視為“這里有一個類型”時,我才熟悉這意味着什么。 如果它在實際代碼中,則不確定它在做什么。

void initState() {
    super.initState();
    ambiguate(WidgetsBinding.instance)!.addObserver(this);
    SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
      statusBarColor: Colors.black,
    ));
    _init();
  }

來自同一 lib 文件夾中的 common.dart 的歧義函數:

T? ambiguate<T>(T? value) => value;

https://github.com/ryanheise/just_audio/tree/minor/just_audio/example/lib

ambiguate函數將一個值轉換為它的可空類型,所以一個int被轉換為int? .

這允許使用! (null assert) 運算符在沒有警告的情況下對值進行操作,因為int類型的值不能為null ,因此您無需斷言它不是。

這樣做的原因是,在還包含非空安全代碼的程序中,該值實際上可以在運行時為null 或者因為您實際上並不知道類型是int還是int? ,因為它在庫的版本之間發生了變化,並且您不想將自己鎖定在最新版本上。

這意味着使用該函數的唯一原因是您希望您的代碼針對同一庫的兩個不同且不兼容的版本運行,一個函數可以返回null的 null 安全或非 null 安全版本,以及一個較新的 null - 安全版本,其中函數不能返回null並且是這樣輸入的。 然后你可以做ambiguate(uncertainValue)?.doSomething() ,如果值不是null它會做一些事情,並且它會在沒有警告的情況下針對兩個版本進行編譯。

如果您不想讓您的代碼針對同一個庫的兩個不同版本(它們的可空性行為不同)工作,那么請不要使用ambiguate 即便如此,請考慮是否更容易要求新版本的庫,並傾向於空安全。

(這種特殊用法似乎沒有必要。如果值為null ,執行ambiguate(something)..method()將拋出錯誤,但something.method() ) 也會拋出錯誤,它也不會發出任何警告。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM