国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

讓前端開發(fā)者失業(yè)的技術(shù),F(xiàn)lutter Web初體驗

shiguibiao / 2296人閱讀

摘要:掌握可能是前端開發(fā)者翻盤的唯一機(jī)會。是開發(fā)必須的代碼庫。區(qū)別與應(yīng)用,我們導(dǎo)入的是庫而非,這是因為目前的接口并非和的完全通用,不過隨著谷歌開發(fā)的繼續(xù),它們最終會被合并到一塊。

Flutter是一種新型的“客戶端”技術(shù)。它的最終目標(biāo)是替代包含幾乎所有平臺的開發(fā):iOS,Android,Web,桌面;做到了一次編寫,多處運行。掌握Flutter web可能是Web前端開發(fā)者翻盤的唯一機(jī)會。

在前些日子舉辦的Google IO 2019 年度開發(fā)者大會上,F(xiàn)lutter web作為一個很亮眼的技術(shù)受到了開發(fā)者的追捧。這是繼Flutter支持Android、IOS等設(shè)備之后,又一個里程碑式的版本,后續(xù)還會支持windows、linux、Macos、chroms等其他嵌入式設(shè)備。Flutter本身是一個類似于RN、WEEX、hHybrid等多端統(tǒng)一跨平臺解決方案,真正做到了一次編寫,多處運行,它的發(fā)展超出了很多人的想象,值得前端開發(fā)者去關(guān)注,今天我們來體驗一下Flutter Web。

概覽

先了解一下Flutter, 它是一個由谷歌開發(fā)的開源移動應(yīng)用軟件開發(fā)工具包,用于為Android和iOS開發(fā)應(yīng)用,同時也將是Google Fuchsia下開發(fā)應(yīng)用的主要工具。自從FLutter 1.5.4版本之后,支持了Web端的開發(fā)。它采用Dart語言來進(jìn)行開發(fā),與JavaScript相比,Dart在 JIT(即時編譯)模式下,速度與 JavaScript基本持平。但是當(dāng)Dart以 AOT模式運行時,Dart性能要高于JavaScript。

Flutter內(nèi)置了UI界面,與Hybrid App、React Native這些跨平臺技術(shù)不同,F(xiàn)lutter既沒有使用WebView,也沒有使用各個平臺的原生控件,而是本身實現(xiàn)一個統(tǒng)一接口的渲染引擎來繪制UI,Dart直接編譯成了二進(jìn)制文件,這樣做可以保證不同平臺UI的一致性。它也可以復(fù)用Java、Kotlin、Swift或OC代碼,訪問Android和iOS上的原生系統(tǒng)功能,比如藍(lán)牙、相機(jī)、WiFi等等。我們公司的Now直播、企鵝輔導(dǎo)等項目、阿里的閑魚等商業(yè)化項目已經(jīng)大量在使用。

架構(gòu)

Flutter的頂層是用drat編寫的框架,包含Material(Android風(fēng)格UI)和Cupertino(iOS風(fēng)格)的UI界面,下面是通用的Widgets(組件),之后是一些動畫、繪制、渲染、手勢庫等。 框架下面是引擎,主要用C / C ++編寫,引擎包含三個核心庫,Skia是Flutter的2D渲染引擎,它是Google的一個2D圖形處理函數(shù)庫,包含字型、坐標(biāo)轉(zhuǎn)換,以及點陣圖,都有高效能且簡潔的表現(xiàn)。Skia是跨平臺的,并提供了非常友好的API。第二是Dart 運行時環(huán)境以及第三文本渲染布局引擎。 最底層的嵌入層,它所關(guān)心的是如何將圖片組合到屏幕上,渲染變成像素。這一層的功能是用來解決跨平臺的。

了解了FLutter 之后,我來說一下今天的重頭戲,F(xiàn)lutter for Web。要想知道Flutter為什么能在web上運行,得先來看看它的架構(gòu)。

通過對比,可以發(fā)現(xiàn),web框架層和mobile的幾乎一模一樣。因此只需要重新實現(xiàn)一下引擎和嵌入層,不用變動Flutter API就可以完全可以將UI代碼從Android / IOS Flutter App移植到Web。Dart能夠使用Dart2Js編譯器把Dart代碼編譯成Js代碼。大多數(shù)原生App元素能夠通過DOM實現(xiàn),DOM實現(xiàn)不了的元素可以通過Canvas來實現(xiàn)。

安裝

Flutter Web開發(fā)環(huán)境搭建,以我的windows環(huán)境為例進(jìn)行講解,其他環(huán)境類似,安裝環(huán)境比較繁瑣,需要耐心,有Android開發(fā)經(jīng)驗最好。

1、在Windows平臺開發(fā)的話,官方的環(huán)境要求是Windows 7 SP1或更高版本(64位)。 2、Java環(huán)境,安裝Java 1.8 + 版本之上,并配置環(huán)境變量,因為android開發(fā)依賴Java環(huán)境。

對于Java程序開發(fā)而言,主要會使用JDK的兩個命令:javac.exe、java.exe。路徑:C:Javajdk1.8.0_181bin。但是這些命令由于不屬于windows自己的命令,所以要想使用,就需要進(jìn)行路徑配置。單擊“計算機(jī)-屬性-高級系統(tǒng)設(shè)置”,單擊“環(huán)境變量”。在“系統(tǒng)變量”欄下單擊“新建”,創(chuàng)建新的系統(tǒng)環(huán)境變量(或用戶變量,等效)。

(1)新建->變量名"JAVA_HOME",變量值"C:Javajdk1.8.0_181"(即JDK的安裝路徑) (2)編輯->變量名"Path",在原變量值的最后面加上“;%JAVA_HOME%in;%JAVA_HOME%jrein” (3)新建->變量名“CLASSPATH”,變量值“.;%JAVA_HOME%lib;%JAVA_HOME%libdt.jar;%JAVA_HOME%lib ools.jar”

3、Android Studio編輯器,安裝Android Studio, 3.0或更高版本。我們需要用它來導(dǎo)入Android license和管理Android SDK以及Android虛擬機(jī)。(默認(rèn)安裝即可)

安裝完成之后設(shè)置代理,左上角的File-》setting-》搜索proxy,設(shè)置公司代理,用來加速下載Android SDK。

之后點擊右上角方盒按鈕(SDK Manager),用來選擇安裝SDK版本,最好選Android 9版本,API28,會有一個很長時間的下載過程。SDK是開發(fā)必須的代碼庫。默認(rèn)情況下,F(xiàn)lutter使用的Android SDK版本是基于你的 adb (Android Debug Bridge,管理連接手機(jī),已打包在SDK)工具版本。 如果您想讓Flutter使用不同版本的Android SDK,則必須將該 ANDROID_HOME 環(huán)境變量設(shè)置為SDK安裝目錄。

右上角有個小手機(jī)類型的按鈕(AVD Manager),用來設(shè)置Android模擬器,創(chuàng)建一個虛擬機(jī)。如果你有一臺安卓手機(jī),也可以連接USB接口,替代虛擬機(jī)。這個過程是調(diào)試必須的。安裝完成之后,在 AVD (Android Virtual Device Manager) 中,點擊工具欄的 Run。模擬器啟動并顯示所選操作系統(tǒng)版本或設(shè)備的啟動畫面。代表了正確安裝。

4、安裝Flutter SDK

下載Flutter SDK有多種方法,看看哪種更適合自己: Flutter官網(wǎng)下載最新Beta版本的進(jìn)行安裝:flutter.dev/docs/develo… 也可Flutter github項目中去下載,地址為:github.com/flutter/flu… 版本越新越好,不要低于1.5.4。

將安裝包zip解壓到你想安裝Flutter SDK的路徑(如:C:srcflutter;注意,不要將flutter安裝到需要一些高權(quán)限的路徑如C:Program Files)。記住,之后往環(huán)境變量的path中添加;C:srcflutterin,以便于你能在命令行中使用flutter。

使用鏡像 由于在國內(nèi)安裝Flutter相關(guān)的依賴可能會受到限制,F(xiàn)lutter官方為中國開發(fā)者搭建了臨時鏡像,大家可以將如下環(huán)境變量加入到用戶環(huán)境變量中: PUB_HOSTED_URL:https://pub.flutter-io.cn FLUTTER_STORAGE_BASE_URL: https://storage.flutter-io.cn

5、安裝Dart與Pub。安裝webdev、stagehand

Pub是Dart的包管理工具,類似npm,捆綁安裝。 Dart安裝版地址:www.gekorm.com/dart-window… 默認(rèn)安裝即可,安裝之后記住Dart的路徑,并且配置到環(huán)境變量path中,以便于可以在命令行中使用dart與pub,默認(rèn)的路徑是:C:Program FilesDartdart-sdkin 先安裝stagehand,stagehand是創(chuàng)建項目必須的工具。查看一下C:UserschunpengliuAppDataRoamingPubCachein目錄下是否包含stagehand和webdev,如果有,添加到環(huán)境變量的path里面,如果沒有,按下面方法安裝:

pub global activate stagehand

webdev是一個類似于Koa的web服務(wù)器,執(zhí)行以下命令安裝

pub global activate webdev
# or
flutter packages pub global activate webdev
6、配置編輯器安裝Flutter和Dart插件

Flutter插件是用來支持Flutter開發(fā)工作流 (運行、調(diào)試、熱重載等)。 Dart插件 提供代碼分析 (輸入代碼時進(jìn)行驗證、代碼補全等)。Android Studio的設(shè)置在File-》setting-》plugins-》搜索Flutter和Dart,安裝之后重啟。

VS code的設(shè)置在extension-》搜索Flutter和Dart,安裝之后重啟。

7、運行 flutter doctor

打開一個新的命令提示符或PowerShell窗口并運行以下命令以查看是否需要安裝任何依賴項來完成安裝:

flutter doctor

這是一個漫長的過程,flutter會檢測你的環(huán)境,并安裝所有的依賴,直至:No issues found!,如果有缺失,會就會再那一項前面打x。你需要一一解決。

一切就緒!

創(chuàng)建應(yīng)用 1、啟動 VS Code

調(diào)用 View>Command Palette…(快捷鍵ctrl+shift+p) 輸入 ‘flutter’, 然后選擇 ‘Flutter: New web Project’

輸入 Project 名稱 (如flutterweb), 然后按回車鍵 指定放置項目的位置,然后按藍(lán)色的確定按鈕 等待項目創(chuàng)建繼續(xù),并顯示main.dart文件。到此,一個Demo創(chuàng)建完成。

我們看到了熟悉的HTML文件以及項目入口文件main.dart。 web目錄下的index.html是項目的入口文件。main.dart初始化文件,圖片相關(guān)資源放在此目錄。 lib目錄下的main.dart,是主程序代碼所在的地方。 每個pub包或者Flutter項目都包含一個pubspec.yaml。它包含與此項目相關(guān)的依賴項和元數(shù)據(jù)。 analysis_options.yaml是配置項目的lint規(guī)則。 /dart_tool 是項目打包運行編譯生成的文件,頁面主程序main.dart.js就在其中。

2、調(diào)試Demo,打開命令行,進(jìn)入到項目根目錄,執(zhí)行:
webdev?flutterweb

編譯、打包完成之后,自動啟動(或者按F5)默認(rèn)瀏覽器,看一下轉(zhuǎn)換后的HTML頁面結(jié)構(gòu):

lib/main.dart是主程序,源碼非常簡單,整個頁面用widgets堆疊而成,區(qū)別于傳統(tǒng)的html和css。

import "package:flutter_web/material.dart";

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Flutter Demo",
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: "Flutter Demo Home Page"),
    );
  }
}

class MyHomePage extends StatelessWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              "Hello, World!",
            ),
          ],
        ),
      ), 
    );
  }
}

區(qū)別與flutter App應(yīng)用,我們導(dǎo)入的是flutter_web/material.dart庫而非flutter/material.dart,這是因為目前App的接口并非和Web的完全通用,不過隨著谷歌開發(fā)的繼續(xù),它們最終會被合并到一塊。 打開pubspec.yaml(類似于package.json),可以看到只有兩個依賴包flutter_web和flutter_web_ui,這兩個都已在github上開源。dev的依賴頁非常少,兩個編譯相關(guān)的包,和一個靜態(tài)文件分析包。

name: flutterweb
description: An app built using Flutter for web
environment:
  # You must be using Flutter >=1.5.0 or Dart >=2.3.0
  sdk: ">=2.3.0-dev.0.1 <3.0.0"
dependencies:
  flutter_web: any
  flutter_web_ui: any
dev_dependencies:
  build_runner: ^1.4.0
  build_web_compilers: ^2.0.0
  pedantic: ^1.0.0
dependency_overrides:
  flutter_web:
    git:
      url: https://github.com/flutter/flutter_web
      path: packages/flutter_web
  flutter_web_ui:
    git:
      url: https://github.com/flutter/flutter_web
      path: packages/flutter_web_ui
實戰(zhàn)

接下來,我們創(chuàng)建一個具有圖文功能的下載,根據(jù)實例來學(xué)習(xí)flutter,我們將實現(xiàn)下圖的頁面。它是一個上下兩欄的布局,下欄又分為左右兩欄。

第一步:更改主應(yīng)用內(nèi)容,打開lib/main.dart文件,替換class MyApp,首先是根組件MyApp,它是一個類組件繼承自無狀態(tài)組件,是項目的主題配置,在home屬性中調(diào)用了Home組件:

class MyApp extends StatelessWidget {
  // 應(yīng)用的根組件
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "騰訊新聞客戶端下載頁", //meta 里的titile
      debugShowCheckedModeBanner: false, // 關(guān)閉調(diào)試bar
      theme: ThemeData(
        primarySwatch: Colors.blue, // 頁面主題 Material風(fēng)格
      ),
      home: Home(), // 啟動首頁
    );
  }
}

第二步,在Home類中,是我們要渲染的頁面頂導(dǎo),運用了AppBar組件,它包括了一個居中的頁面標(biāo)題和居右的搜索按鈕。文本可以像css一樣設(shè)置外觀樣式。

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        backgroundColor: Colors.white,
        elevation: 0.0,
        centerTitle: true,
        title: Text( // 中心文本
          "下載頁",
          style:
              TextStyle(color: Colors.black, fontSize: 16.0, fontWeight: FontWeight.w500),
        ),
// 搜索圖標(biāo)及特性
        actions: [ 
          Padding(
            padding: const EdgeInsets.symmetric(horizontal: 20.0),
            child: Icon(
              Icons.search,
              color: Colors.black,
            ),
          )
        ],
      ),
//調(diào)用body渲染類,此處可以添加多個方法調(diào)用
      body: Stack(
        children: [
            Body() 
        ],
      ),
    );
  }
}

第三步,創(chuàng)建頁面主體內(nèi)容,一張圖加多個文本,使用了文本組件和圖片組件,頁面結(jié)構(gòu)采用了flex布局,由于兩個Expanded的Flex值均為1,因此將在兩個組件之間平均分配空間。SizedBox組件相當(dāng)于一個空盒子,用來設(shè)置margin的距離

class Body extends StatelessWidget {
  const Body({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Row(
      crossAxisAlignment: CrossAxisAlignment.stretch,
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      children: [
        Expanded( // 左側(cè)
          flex: 1,
          child: Image.asset(// 圖片組件
            "background-image.jpg", // 這是一張在web/asserts/下的背景圖
            fit: BoxFit.contain,
          ),
        ),
        const SizedBox(width: 90.0),
        Expanded( // 右側(cè)
          flex:1,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text( // 文本組件
                "騰訊新聞",
                style: TextStyle(
                    color: Colors.black, fontWeight: FontWeight.w600, fontSize: 50.0, fontFamily: "Merriweather"),
              ),
              const SizedBox(height: 14.0),// SizedBox用來增加間距
              Text(
                "騰訊新聞是騰訊公司為用戶打造的一款全天候、全方位、及時報道的新聞產(chǎn)品,為用戶提供高效優(yōu)質(zhì)的資訊、視頻和直播服務(wù)。資訊超新超全,內(nèi)容獨家優(yōu)質(zhì),話題評論互動。",
                style: TextStyle(
                    color: Colors.black, fontWeight: FontWeight.w400, fontSize: 24.0, fontFamily: "Microsoft Yahei"),
                textAlign: TextAlign.justify,
              ),
              const SizedBox(height: 20.0), 
              FlatButton(
                onPressed: () {}, // 下載按鈕的響應(yīng)事件
                color: Color(0xFFCFE8E4),
                shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(16.0),
                ),
                child: Padding(
                  padding: const EdgeInsets.all(12.0),
                  child: Text("點擊下載", style: TextStyle(fontFamily: "Open Sans")),
                ),
              ),
            ],
          ),
        ),
        const SizedBox(width: 100.0),
      ],
    );
  }
}

到此,頁面創(chuàng)建結(jié)束,保存,運行webdev serve,就可以看到效果了。

總結(jié)

FLutter web是Flutter 的一個分支,在開發(fā)完App之后,UI層面的FLutter代碼在不修改的情況下可以直接編譯為Web版,基本可以做到代碼100%復(fù)用,體驗還不錯。目前Flutter web作為預(yù)覽版無論從性能上、易用上還是布局上都超出了預(yù)期,觸摸體驗挺好,雖然體驗比APP差一些,但是比傳統(tǒng)的web要好很多。試想一下 Flutter 開發(fā)iOS 和Android的App 還免費贈送一份Web版,并且比傳統(tǒng)的web開發(fā)出來的體驗還好。Write once ,Run anywhere。何樂而不為?

我覺得隨著谷歌的持續(xù)優(yōu)化,等到正式版發(fā)布之后,開發(fā)體驗越來越好,F(xiàn)lutter開發(fā)者會吃掉H5很大一部分份額。Flutter 可能會給目前客戶端的開發(fā)模式帶來一些變革以及分工的變化, Flutter目前的開發(fā)體驗不是很好,?但是潛力很大,值得前端人員去學(xué)習(xí)。

但是目前還是有一部分問題,F(xiàn)lutter web是為客戶端開發(fā)(尤其是安卓)人員開發(fā)準(zhǔn)備的,對于前端理解來說學(xué)習(xí)成本有點高。目前FLutter web和 flutter 還是兩個項目,編譯環(huán)境也是分開的,需要在代碼里面修改Flutter相關(guān)庫的引用為Flutter_web,組件還不能達(dá)到完全通用,這個谷歌承諾正在解決中,谷歌的最終目標(biāo)是Web、移動App、桌面端win mac linux、以及嵌入式版的Flutter代碼庫之間保持100%的代碼可移植性。

個人感覺,開發(fā)體驗還不太好,還有很多坑要去踩,版本變更很快。還有社區(qū)資源稀少的問題,需要一定長期的積累。兼容性問題,代碼轉(zhuǎn)換后大量使用了web components,除了chrome之外,兼容性還是有些問題。

安利時間

我們在web開發(fā)過程中,都見過或者使用過一些奇技淫巧,這種技術(shù)我們統(tǒng)稱為黑魔法,這些黑魔法散落在各個角落,為了方便大家查閱和學(xué)習(xí),我們做了收集、整理和歸類,并在github上做了一個項目——awesome-blackmargic,希望各位愛鉆研的開發(fā)者能夠喜歡,也希望大家可以把自己的獨門絕技分享出來,如果有興趣可以給我們發(fā)pr。

如果你對Flutter感興趣,想進(jìn)一步了解Flutter,加入我們的QQ群(784383520)吧!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/7874.html

相關(guān)文章

  • Flutter 體驗

    摘要:懷著這樣的目的,就開始了的發(fā)現(xiàn)之旅。每一個部分都都很多內(nèi)容,每一個部分都可以單獨成章,為了避免文章過長,影響閱讀體驗,每一部分就不細(xì)講,以后會以獨立文章的形式分享。另外,本文代碼已上傳至代碼地址,如果本文對你有幫助,希望能點個 showImg(https://segmentfault.com/img/bVbpVDs?w=400&h=200); 前言 這兩年 Flutter 人氣越來越...

    HmyBmny 評論0 收藏0
  • Flutter 體驗

    摘要:懷著這樣的目的,就開始了的發(fā)現(xiàn)之旅。每一個部分都都很多內(nèi)容,每一個部分都可以單獨成章,為了避免文章過長,影響閱讀體驗,每一部分就不細(xì)講,以后會以獨立文章的形式分享。另外,本文代碼已上傳至代碼地址,如果本文對你有幫助,希望能點個 showImg(https://segmentfault.com/img/bVbpVDs?w=400&h=200); 前言 這兩年 Flutter 人氣越來越...

    fuchenxuan 評論0 收藏0
  • 6月份最新語言排行:Java,Python我更看好誰?

    摘要:作為一種現(xiàn)代語言,它看起來像一種舊語言,因更傾向于做移動和網(wǎng)站開噶。所以,個人覺得每種語言都有其自己的優(yōu)勢,找到自己的短板并補足自己的短板。總結(jié)于哥更推薦想成為某種語言編程大牛的人,不建議只想搬運帶代碼的碼農(nóng)。 文章首發(fā)于終端研發(fā)部,轉(zhuǎn)載,請標(biāo)明原文鏈接 今天的主題是:探討一下6月份語言排行還有我的最新展望! 最近,編程語言排行榜前幾天發(fā)布更新了,在最新的TIOBE編程語言排行榜中,J...

    svtter 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<