Flutter 即學即用系列博客——04 Flutter UI 初窺

来源:https://www.cnblogs.com/nesger/archive/2019/02/19/10400012.html
-Advertisement-
Play Games

Flutter 即學即用系列博客新篇章來了,UI 初窺,帶你探索神秘夢幻的 UI 世界 ...


前面三篇可以算是一個小小的里程碑。

主要是介紹了 Flutter 環境的搭建、如何創建 Flutter 項目以及如何在舊有 Android 項目引入 Flutter。

這一篇我們來學習下 Flutter 的 UI。

前言

說到 UI,我就簡單說下 Flutter 作為一門跨平臺語言具有的優勢之一,提高效率吧。

舉個例子:

假設現在要開發一個界面,Android 開發需要一天,iOS 開發也需要一天。那麼就是兩天。

如果你用 Flutter 開發,就只需要一天(因為 Android 和 iOS 都可以共用一套 Flutter 代碼)。這樣效率自然就提高了。

另外,假設後面產品發現界面有個位置需要調整,如果是 Android 或者 iOS 單獨開發,則兩個端都需要進行額外調整。

而 Flutter 就一套代碼而已,所以相較之下 Flutter 更易維護。

官網關於 UI 的介紹 User interface

這邊筆者按照自己的感受和認識進行說明。

讀者看完之後有了個基本的認識,後續不管是閱讀官方文檔還是使用搜索引擎搜索相關問題,相信會事半功倍。

記住一句話:

Flutter 裡面一切皆 Widget。

目錄

1. 基本配置

我們緊接之前文章,現在進入 MyApp/sub/my_flutter 位置。

打開 main.dart。如果提示下圖:

Dart support is not enabled for the project

我們點擊右邊第一個(Enabled Dart support)或者第二個(Open Dart settings)都是 OK 的。

如果點擊第二個,需要配置 dart 的目錄。

dart 的目錄在 flutter 的 bin 目錄下麵的 cache 目錄下麵。

舉個例子,筆者的 flutter bin 目錄(terminal 執行which flutter)為/Users/nesger/Desktop/nesger_folder/flutter/flutter/bin/,那麼 dart 目錄就在/Users/nesger/Desktop/nesger_folder/flutter/flutter/bin/cache/dart-sdk

然後直接拷貝下麵代碼替換 main.dart 的代碼。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: Text('My Flutter'),
          ),
          body: Center(),
        )
    );
  }
}

實際編譯器可能會顯示如下圖,就是會有註釋顯示每個控制項。

這有好處也有壞處。好處就是你可以看到哪一塊是哪一個 Widget。壞處就是視覺干擾。

這個是自動產生的,不可刪除。

可以通過如下操作控制是否顯示:

Android Studio->Preferences->Editor->General->Appearance

2. main.dart 學習

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: Text('My Flutter'),
          ),
          body: Center(),
        )
    );
  }
}

執行 flutter run 運行後可以看到下圖:

對比上面代碼可看到頂部藍色區域是 AppBar 這個 Widget 來控制的。

你可以自行修改 Text 裡面的內容然後按 r 鍵通過熱重載看下效果。

我們可以看到,Flutter 裡面的 dart 代碼一個比較明顯的地方就是一個 Widget 套著一個 Widget,有點樹形的樣子。

比如這裡

我們嘗試把 AppBar 去掉,可以看到界面顯示就是一片純白的界面。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
          body: Center(),
        )
    );
  }
}

那麼這裡的 MaterialApp Widget 是不是必需的呢?

其實 MaterialApp 說明這個界面是按照 Material Design 的風格。

我們看下如果去掉會怎樣?

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(),
    );
  }
}

所以說 Scaffold 這個 Widget 不能直接返回,我們需要給它外面套一層 MaterialApp。

可以看下這個鏈接:https://github.com/nesger/FlutterNote/issues/4

我們返回之前的狀態,然後給他加一個 Hello World,看下怎樣?

我們知道,Flutter 一切皆 Widget,所以需要顯示 Hello World,就需要 Widget。

Widget 可以通過這個鏈接查看:https://flutter.io/docs/development/ui/widgets

可以看到 Text 這個 Widget

點擊進入

再點擊進入,可以看到介紹以及 Sample。

大家以後如果要看其他 Widget 也可以按照同樣的方式學習。

當然如果時間要求比較緊的話,大家學完博客可以直接在搜索引擎輸入關鍵字看下別人的 Sample,然後化用一下就沒問題啦。

我們點擊右邊複製,然後簡單修改如下:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
            child: Text(
              'Hello World!',
              textAlign: TextAlign.center,
              overflow: TextOverflow.ellipsis,
              style: TextStyle(fontWeight: FontWeight.bold),
            ),
        ),
      ),
    );
  }
}

可以看到我們將其放到 Center 這個 Widget 裡面,表示居中,同時作為它的一個 child。

大家可以試下去掉 Center 會怎樣,直接將 Text 作為 body,如下:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Text(
          'Hello World!',
          textAlign: TextAlign.center,
          overflow: TextOverflow.ellipsis,
          style: TextStyle(fontWeight: FontWeight.bold),
        ),
      ),
    );
  }
}

可以想象應該是不居中的。

到了這裡你應該可以發現,我們整個頁面其實是 body 對應的 Widget 來控制的。

上面我們的例子都是 MaterialApp,是不是一定只能這個 Widget 在最外層?

不是的,只是這裡 Scaffold 跟它配對而已,我們可以修改如下:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text(
        'Hello, world!',
        textDirection: TextDirection.ltr,
        textAlign: TextAlign.center,
        overflow: TextOverflow.ellipsis,
        style: TextStyle(fontWeight: FontWeight.bold),
      ),
    );
  }
}

註意多了一行textDirection: TextDirection.ltr,沒有會報錯。

3. 以 Text 為例子初窺 Widget 寫法

我們點進去 Text 源碼看下,

對比一下上面我們的代碼:

Text(
        'Hello, world!',
        textDirection: TextDirection.ltr,
        textAlign: TextAlign.center,
        overflow: TextOverflow.ellipsis,
        style: TextStyle(fontWeight: FontWeight.bold),
      )

我們可以這樣認為,括弧裡面的是待傳入參數。其中沒有花括弧{}包裹的是必填項,有花括弧{}的是選填項。

有花括弧{}的在傳入參數時需要指定參數,格式為參數:值。不同參數之間逗號分隔。

所以我們可以猜測上面 Center 下麵的 child 應該是在花括弧裡面。所以才會有上面的寫法,我們跟進去源碼看看。

確實跟我們猜的一樣。而且由於參數的類型是 Widget,所以可以傳 Text 也是沒問題的。

所以到這裡你再回顧一下上面是不是就知道上面代碼的寫法了呢?

總結

由於 Flutter UI 內容比較多,講起來篇幅會比較大。

所以我們會拆分成幾篇文章進行講解。

回顧一下,本篇文章主要講解如下內容:

  1. dart sdk 配置和 dart 源代碼括弧後面編譯器提示的顯示和隱藏。
  2. 通過 main.dart 的修改初步熟悉 Flutter 界面的寫法。
  3. 通過 Text 說明如何在官方文檔上面查找控制項和對應 Sample。
  4. 通過一個具體的小控制項 Text 初窺 Flutter Widget 的寫法和使用方法。

小彩蛋

這個彩蛋是微信群里一個小伙伴說到的。這裡分享給大家。

簡單說就是設置 Android Studio 的背景圖。

先上圖

大家覺得哪種更加賞心悅目呢?

可以根據自己的喜好確定是否設置。

設置方法為

第一步:Android Studio->Preferences

第二步:點擊 Appearance,右邊的 Background image...

第三部:輸入圖片所在位置

其中 Opacity 是不透明度。

0 表示完全透明,跟沒設置一樣。100 表示完全不透明。

一般預設即可。

背景圖公眾號回覆「ASBG」獲取。

更多閱讀:
Flutter 即學即用系列博客——01 環境搭建
Flutter 即學即用系列博客——02 一個純 Flutter Demo 說明
Flutter 即學即用系列博客——03 在舊有項目引入 Flutter


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

-Advertisement-
Play Games
更多相關文章
  • 在前面的分享中,有講解 “詳解MongoDB中的多表關聯查詢($lookup)” 一節,其內容涵蓋了常見的集合管理的需求。我們知道文檔的選擇都是通過$match進行匹配刷選。但這是文檔間的匹配篩選,並沒有對單個新生成的文檔進行內嵌子文檔進行篩選。 那麼什麼是$lookup後新文檔的內嵌子文檔呢? 假 ...
  • 安裝前準備 主機和系統 Host OS Memory IP bigdata001-dev Cent OS 7.4 x64 32G 192.168.1.1 bigdata002-dev Cent OS 7.4 x64 32G 192.168.1.2 bigdata003-dev Cent OS 7.4 ...
  • 實際應用程式開發過程中,大部分業務表是由程式進行增刪改,為避免衝突通常會配置序列表來配置序列生成規則。也部分表由運維人員進行配置,如系統控制參數等配置,程式不直接做增刪改; 如果當前需求需要新增新的控制參數,由開發人員提供腳本,運維執行; 通常在插入數據時,主鍵的生成,通常採用的是max(t.id) ...
  • [20190219]那個更快(11g).txt--//前幾天測試11g Query Result Cache RC Latches時,鏈接http://blog.itpub.net/267265/viewspace-2632907/--//有網友指出測試有問題,建立索引唯一,並不會導致select ...
  • 阿裡雲OSS的Android SDK訪問控制中不使用STS的方法 ...
  • 重新配置了studio 的工作環境, 沒問題,後來加需求要新增java類和介面,這就出現問題了,新建的時候,就會報錯: Unable to parse template "Interface" Error message: This template did not produce a Java c ...
  • 在Android 插件化技術中(宿主app和插件app設置相同的sharedUserId),動態載入apk有兩種方式: 一種是將資源主題包的apk安裝到手機上再讀取apk內的資源,這種方式的原理是將宿主app和插件app設置相同的sharedUserId,這樣兩個app將會在同一個進程中運行,並可以 ...
  • 今天,直接用AS在小米手機上運行安裝的時候總是報錯:INSTALL_FAILED_USER_RESTRICTED,於是乎,通過以下方式解決: 在開發者選項將USB安裝打開,然後,哈,解決了。記錄一下。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...