還記得第一個看到的Flutter組件嗎?

来源:https://www.cnblogs.com/mengqd/archive/2020/03/21/12540243.html

註意:無特殊說明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 MaterialApp 在學習Flutter的過程中我們第一個看見的控制項應該就是MaterialApp,畢竟創建一個新的Flutter項目的時候,項目第一個組 ...


註意:無特殊說明,Flutter版本及Dart版本如下:

  • Flutter版本: 1.12.13+hotfix.5
  • Dart版本: 2.7.0

MaterialApp

在學習Flutter的過程中我們第一個看見的控制項應該就是MaterialApp,畢竟創建一個新的Flutter項目的時候,項目第一個組件就是MaterialApp,這是一個Material風格的根控制項,基本用法如下:

MaterialApp(
  home: Scaffold(
    appBar: AppBar(
      title: Text('老孟'),
    ),
  ),
)

home參數是App預設顯示的頁面,效果如下:

title參數是應用程式的描述,在Android上,在任務管理器的應用程式快照上面顯示,在IOS上忽略此屬性,IOS上任務管理器應用程式快照上面顯示的是Info.plist文件中的CFBundleDisplayName。如果想根據區域顯示不同的描述使用onGenerateTitle,用法如下:

MaterialApp(
  title: '老孟',
  onGenerateTitle: (context) {
    var local = Localizations.localeOf(context);
    if (local.languageCode == 'zh') {
      return '老孟';
    }
    return 'laomeng';
  },
  ...
)

routesinitialRouteonGenerateRouteonUnknownRoute是和路由相關的4個屬性,路由簡單的理解就是頁面,路由的管理通常是指頁面的管理,比如跳轉、返回等。

MaterialApp按照如下的規則匹配路由:

  1. 路由為/home不為null則使用home
  2. 使用routes指定的路由。
  3. 使用onGenerateRoute生成的路由,處理除homeroutes以外的路由。
  4. 如果上面都不匹配則調用onUnknownRoute

是不是還是比較迷糊,不要緊,看下麵的例子就明白了:

MaterialApp(
  routes: {
    'container': (context) => ContainerDemo(),
    'fitted': (context) => FittedBoxDemo(),
    'icon': (context) => IconDemo(),
  },
  initialRoute: '/',
  home: Scaffold(
    appBar: AppBar(
      title: Text('老孟'),
    ),
  ),
  onGenerateRoute: (RouteSettings routeSettings){
        print('onGenerateRoute:$routeSettings');
        if(routeSettings.name == 'icon'){
          return MaterialPageRoute(builder: (context){
            return IconDemo();
          });
        }
      },
      onUnknownRoute: (RouteSettings routeSettings){
        print('onUnknownRoute:$routeSettings');
        return MaterialPageRoute(builder: (context){
          return IconDemo();
        });
      },
  ...
)

initialRoute設置為/,那麼載入home頁面。

如果initialRoute設置為icon,在routes中存在,所以載入routes中指定的路由,即IconDemo頁面。

如果initialRoute設置為icons1,此時routes中並不存在名稱為icons1的路由,調用onGenerateRoute,如果onGenerateRoute返迴路由頁面,則載入此頁面,如果返回的是null,且home不為null,則載入home參數指定的頁面,如果home為null,則回調onUnknownRoute

themedarkThemethemeMode是關於主題的參數,設置整個App的主題,包括顏色、字體、形狀等,修改主題顏色為紅色用法如下:

MaterialApp(
  theme: ThemeData(
    primaryColor: Colors.red
  ),
  darkTheme: ThemeData(
      primaryColor: Colors.red
  ),
  themeMode: ThemeMode.dark,

效果如下:

localelocalizationsDelegateslocaleListResolutionCallbacklocaleResolutionCallbacksupportedLocales是區域設置和國際化相關的參數,如果App支持多國語言,那麼就需要設置這些參數,預設情況下,Flutter僅支持美國英語,如果想要添加其他語言支持則需要指定其他MaterialApp屬性,並引入flutter_localizations 包,到2019年4月,flutter_localizations包已經支持52種語言,如果你想讓你的應用在iOS上順利運行,那麼你還必須添加“flutter_cupertino_localizations”包。

pubspec.yaml文件中添加包依賴:

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  flutter_cupertino_localizations: ^1.0.1

設置如下:

MaterialApp(
  localizationsDelegates: [
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate
  ],
  supportedLocales: [
    const Locale('zh', 'CH'),
    const Locale('en', 'US'),
  ],
  ...
)
  • GlobalMaterialLocalizations.delegate :為Material Components庫提供了本地化的字元串和其他值。
  • GlobalWidgetsLocalizations.delegate:定義widget預設的文本方向,從左到右或從右到左。
  • GlobalCupertinoLocalizations.delegate:為Cupertino(ios風格)庫提供了本地化的字元串和其他值。

supportedLocales參數指定了當前App支持的語言。

localeResolutionCallbacklocaleListResolutionCallback都是對語言變化的監聽,比如切換系統語言等,localeResolutionCallbacklocaleListResolutionCallback的區別是localeResolutionCallback返回的第一個參數是當前語言的Locale,而localeListResolutionCallback返回當前手機支持的語言集合,在早期的版本手機沒有支持語言的集合,只顯示當前語言,在設置->語言和地區的設置選項效果如下:

在早期是沒有紅色區域的。

因此我們只需使用localeListResolutionCallback即可,通過用戶手機支持的語言和當前App支持的語言返回一個語言選項。

通常情況下,如果用戶的語言正好是App支持的語言,那麼直接返回此語言,如果不支持,則返回一個預設的語言,用法如下:

MaterialApp(
  localeListResolutionCallback:
      (List<Locale> locales, Iterable<Locale> supportedLocales) {
    if (locales.contains('zh')) {
      return Locale('zh');
    }
    return Locale('en');
  },
  ...
)

在App中也可以通過如下方法獲取區域設置:

Locale myLocale = Localizations.localeOf(context);

還有幾個方便調試的選項,debugShowMaterialGrid:打開網格調試

MaterialApp(
  debugShowMaterialGrid: true,

效果如下:

showPerformanceOverlay:打開性能檢測

MaterialApp(
  showPerformanceOverlay: true,

效果如下:

右上角有一個DEBUG的標識,這是系統在debug模式下預設顯示的,不顯示的設置如下:

MaterialApp(
  debugShowCheckedModeBanner: true,
  ...
)

CupertinoApp

我想你一定能想到既然有Material風格的MaterialApp,那麼也應該有Cupertino(ios)風格與之相對應,是的Cupertino風格的是CupertinoApp,CupertinoApp的屬性及用法和MaterialApp一模一樣,就不在具體介紹了。

歡迎加入Flutter的微信交流群(laomengit),一起學習,一起進步,生活不止眼前的苟且,還有詩和《遠方》。

當然我也非常希望您關註我個人的公眾號,裡面有各種福利等著大家哦。


您的分享是我們最大的動力!

更多相關文章
  • 一 Pod安全 1.1 PodSecurityPolicy啟用 為了更精細地控制Pod對資源的使用方式,Kubernetes從1.4版本開始引入了PodSecurityPolicy資源對象對Pod的安全策略進行管理,併在1.1版本中升級為Beta版,到1.14版本時趨於成熟。 若想啟用PodSecu ...
  • 1. WebView用法 ①佈局文件新建一個WebView,特別註意線性佈局和控制項的寬高都要匹配父控制項 ②代碼中的配置 ③AndroidManifest.xml文件中聲明許可權 2. 使用HTTP協議訪問網路 (1)使用HttpURLConnection 首先學習一個新的控制項ScrollView 由於 ...
  • 網路上有很多MySQL表碎片整理的問題,大多數是通過demo一個表然後參考data free來進行碎片整理,這種方式對myisam引擎或者其他引擎可能有效(本人沒有做詳細的測試).對Innodb引擎是不是準確的,或者data free是不是可以參考,還是值得商榷的。本文基於MySQL的Innodb存 ...
  • 前言:昨日與今日重裝SQL Server2016,報了"Polybase要求安裝Oracle JRE 7更新51(64位)或更高版本"規則失敗的錯誤,網上查詢資料,有兩種解決方式,一種是安裝JDK、另一種是不安裝此功能。通過對Polybase功能的瞭解,決心安裝一下SDK。沒想到遇到了茫茫多的坑。總 ...
  • 安裝 第一步:打開百度雲鏈接,下載安裝包 鏈接:https://pan.baidu.com/s/1gE96PTcuMovmqE4TEFHvwA 提取碼:rm6g 第二步:雙擊打開,等待5s,點擊下一步 第三步:接受協議,點擊下一步 第四步:選擇安裝類型,有“Typical(預設)”、“Complet ...
  • 最近在學習springboot,想整理一篇博客,關於springboot整合mybatis並配置主從資料庫的,但是電腦win10系統上並沒有配置mysql主從資料庫。所以花了幾天的時間終於整好了。在這裡記錄一下。 首先是關於在win10上安裝兩個mysql8的步驟,我找到了一篇博客,按照上面的步驟, ...
  • 今遇到問題: 查看表空間,發現表空間大小已達到32G,但創建表空間時已設置了無限擴展(初始空間為1G),磁碟空間沒滿,說明表空間無法進行自動擴展了。 問題原因: 查找資料瞭解到Oracle單個表空間數據文件的最大值為: 最大數據塊 * DB_BLOCK_SIZE 查看Oracle的 DB_BLOCK ...
  • (1)用戶標識和鑒別: 該方法由系統提供一定的方式讓用戶標識自己的名字或身份。每次用戶要求進入系統時,由系統進行核對,通過鑒定後才能提供系統的使用權 (2)存取控制 通過用戶許可權定義和合法權檢查確保只有合法許可權的用戶訪問資料庫,所有未授權的人員無法存取數據 (3)視圖機制 為不同的用戶定義視圖,通過 ...
一周排行
  • 在上篇文章中我們已經知道了多線程是什麼了,那麼它到底可以幹嘛呢?這裡特別聲明一個前面的委托沒看的同學可以到上上上篇博文查看,因為多線程要經常使用到委托。源碼 一、非同步、同步 1.同步(在計算的理解總是要你措不及防,同步當線程做完一件事情之後,才會執行後續動作),同步方法慢,只有一個線程執行,非同步方法 ...
  • 本文主要是講解stopwatch對程式運行時間的準確測量 僅僅介紹裡面的StartNew()方法,Restart()方法和ElapsedMilliseconds { get;}屬性 public void StartNew():作用是對新的 System.Diagnostics.Stopwatch ...
  • 一、引言 RabbitMQ是Rabbit Message Queue的簡寫,但不能僅僅理解其為消息隊列,消息代理更合適。RabbitMQ是一個由 Erlang 語言開發的AMQP(高級消息隊列協議)的開源實現,其內部結構如下: RabbitMQ作為一個消息代理,主要和消息打交道,負責接收並轉發消息。 ...
  • TerminalMACS(Terminal Manager And Check System) 遠程終端管理和檢測系統 本文同步更新地址:https://dotnet9.com/11429.html 一、本系統可監控多種終端資源: 移動端 Android iOS PC端 Windows Linux ...
  • 首先,好消息是Goole將於2020年2月份發佈Chrome 80版本。本次發佈將推進Google的“漸進改良Cookie”策略,打造一個更為安全和保障用戶隱私的網路環境。 壞消息是,本次更新可能導致瀏覽器無法向服務端發送Cookie。如果你有多個不同功能變數名稱的應用,部分用戶很有可能出現會話時常被打斷的 ...
  • 在偶然一次調試某程式時,遇到提示: 無法載入程式集*****.XmlSerializers.dll,文件找不到(Could not load file or assembly ****.XmlSerializers.dll , FileNotFoundException...)。於是嘗試在項目屬性中 ...
  • 在上一篇abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之五(四十一) 文章中實現了入庫管理的列表頁面,並實現了控制器的代碼。在今天我們學習如何在前端實現新增入庫單信息界面。 ...
  • 面向對象 面向對象是一個抽象的概念,其本質就是對事物以抽象的方式建立對應的模型。 簡單來講,比如我有一隻鋼筆,那麼我就可以通過分析,可以得到 這隻鋼筆的材第是塑料,品牌是個雜牌 ,裡面裝的墨是黑色的,可以用。這時候就能建立一個鋼筆的模型,它在這裡應該有這些屬性: 圖是一個不正確的UML類圖,但是可以 ...
  • 在ASP.NET MVC中有四種過濾器類型 Action 1、在ASP.NET MVC項目中,新建文件夾Filter,然後新建類MyCustormFilter,繼承自ActionFilterAttribute類,我們來看下ActionFilterAttribute類有如下四個方法,從命名我應該就可以 ...
  • 你需要瞭解的 HTTP Status Code Intro 現在前後端分離的開發模式越來越流行,後端負責開發對應的 API,前端只需要 關註前端頁面的數據展示和前端邏輯即可。 對於前後端分離這種開發模式,我個人還是比較喜歡的,因為這樣可以讓更專業的人做更專業的事情,後端專註於做 API 的開發設計, ...
x