簡體   English   中英

Flutter 中全局變量的最佳實踐

[英]Best practices for globals in flutter

我正在構建一個具有文本到語音的應用程序。 可以改變聲音和設置速度等。 我正在使用來自公共開發人員的標准 TTS。

我的問題是,如何初始化它並在整個應用程序中使用它,而無需在任何地方重新創建它,因為對象很少會改變。

一旦設置好,我只想讓它說話。

每次我需要它時都重新創建它當然不是不可能的。

我正在尋找最佳實踐。

只需要一個包含所有信息的類和一個初始化方法:

class Constants {

  static bool firstVar;
  static String secondVar;

  static void initialize() {
    firstVar = true;
    secondVar = "";
  }
}

// then call it in your main method before building the first widget

Constants.initialize();

在這種情況下,您需要使用狀態管理架構。

有很多可供選擇。 有許多文章和視頻解釋了如何使用它們。 他們有一個共同點就是你在尋找什么。 無需在每個小部件中重新配置即可在應用程序范圍內提供狀態的能力。

在此處查看 Flutter 文檔 瀏覽下一頁,您將對狀態管理有一個很好的總體概述。 可用的選項包括 Provider、Riverpod、Redux、InheritedWidget、 Stacked等(實際上有很多)。

例如,使用 Provider,您可以在某個 TTS StateProvider 中初始化 TTS(只是一個示例)。 然后將最頂層的 MaterialApp 包裝在 ProviderScope 中后,您可以輕松地在任何小部件中使用 TTS,如下所示:

final tts = Provider.of<TTSProvider>(context).tts;
tts.doWhateverYouWant();

這些架構的另一個優點是它們中的大量允許關注點和依賴注入(或控制反轉)的良好分離

簡單來說,關注點分離使您能夠將特定於 UI 的代碼與特定於邏輯的代碼分開編寫。 這樣,如果您想調試或更改您正在使用的包或 API,您可以從一個地方輕松完成(不必擔心損壞代碼庫)。 此外,它也促進了干凈的代碼。

依賴注入涉及使用服務或類似的東西來獲取小部件需要工作的內容,而無需小部件自己配置服務。

隨着您的探索,您還會注意到某些架構(如 Stacked)允許您在沒有 BuildContext 的情況下管理應用程序范圍的狀態。 對於 TTS 的另一個示例,使用堆疊架構,您可以:

final tts = locator<TTSService>().tts;
tts.doWhateverYouWant();

這種模式很有用,因為在 StatelessWidgets 中,BuildContext 僅在 build 方法中可用,您可能需要使用它之外的東西。 除了在 Flutter 代碼中的任意位置獲取 TTS 之外,您還可以在沒有 BuildContext 的情況下執行其他操作,例如 BottomSheet、Navigation、Toast 等。

此外,您會注意到您將傾向於使用更多的無狀態小部件,因為小部件不再為您保留狀態。

最后一點,不要擔心性能。 Flutter 本身是高效的,並且可以正確處理所有內容。

暫無
暫無

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

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