Flutter入門|(二)Widget

Widget

Flutter Widget采用現(xiàn)代響應(yīng)式框架構(gòu)建,這是從 React 中獲得的靈感,中心思想是用widget構(gòu)建你的UI。 Widget描述了他們的視圖在給定其當(dāng)前配置和狀態(tài)時應(yīng)該看起來像什么。當(dāng)widget的狀態(tài)發(fā)生變化時,widget會重新構(gòu)建UI,F(xiàn)lutter會對比前后變化的不同, 以確定底層渲染樹從一個狀態(tài)轉(zhuǎn)換到下一個狀態(tài)所需的最小更改。

給我的感覺,萬物皆為Widget。Android xml中的layout是Widget,ViewGroup是Widget,View也是Widget...

一個最簡單的Android app是在是在activity.main.xml中定義一個"hello world";一個最簡單的Flutter應(yīng)用也是一樣,只需一個widget即可!代碼如下:

import 'package:flutter/material.dart';

void main() {
  runApp(
    new Center(
      child: new Text(
        'Hello, world!',
        textDirection: TextDirection.ltr,
      ),
    ),
  );
}

runApp()方法類似于程序的入口,給定的是一個widget的根。一般這個widget都會指定一個無狀態(tài)的StatelessWidget或者是有狀態(tài)的StatefulWidget
無狀態(tài)的StatelessWidget只能用來展示信息,不能有動作(用戶交互);有狀態(tài)的StatefulWidget可以通過改變狀態(tài)使得 UI 發(fā)生變化,它可以包含用戶交互。

按照Flutter中文網(wǎng)的學(xué)習(xí)引導(dǎo),我們剛開始接觸的Widget就是StatelessWidgetStatefulWidget,下面來做一個初步的講解。

StatelessWidget

A widget that does not require mutable state.
譯為:不需要可變狀態(tài)的控件。

  • Stateless widgets 是不可變的, 這意味著它們的屬性不能改變 - 所有的值都是最終的。
  • StatelessWidget一共只有三個方法:
  // 構(gòu)造方法
  const StatelessWidget({ Key key }) : super(key: key);
  
  // createElement方法復(fù)寫Widget方法,一般不需要使用
  @override
  StatelessElement createElement() => StatelessElement(this);

  // 用戶界面的構(gòu)建,描述此控件顯示到用戶界面部分。
  @protected
  Widget build(BuildContext context);

StatelessWidget 的使用非常簡單,我們只需要繼承 StatelessWidget,然后實現(xiàn) build 方法就可以了。 demo示例代碼如下:

import 'package:flutter/material.dart';

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

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

StatefulWidget

A widget that has mutable state.
譯為:具有可變狀態(tài)的控件。

  • Stateful widgets 持有的狀態(tài)可能在widget生命周期中發(fā)生變化. 實現(xiàn)一個 stateful widget 至少需要兩個類:
    • 一個 StatefulWidget類。
    • 一個 State類。 StatefulWidget類本身是不變的,但是 State類在widget生命周期中始終存在。
  • StatefulWidget一共只有三個方法:
  // 構(gòu)造方法
  const StatefulWidget({ Key key }) : super(key: key);
  
  // createElement方法復(fù)寫Widget方法,一般不需要使用
  @override
  StatefulElement createElement() => StatefulElement(this);

  // 在視圖樹中的給定位置為這個控件創(chuàng)建可變狀態(tài)。
  @protected
  State createState();

StatefulWidget 用起來麻煩一些,它除了需要繼承自StatefulWidget,還需要一個 State。demo示例代碼如下:

import 'package:flutter/material.dart';
import 'package:english_words/english_words.dart';

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

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

class RandomWords extends StatefulWidget {
  @override
  createState() => new RandomWordsState();
}

class RandomWordsState extends State<RandomWords> {
  @override
  Widget build(BuildContext context) {
    final wordPair = new WordPair.random();
    return new Text(wordPair.asPascalCase);
  }
}

總結(jié)

從代碼層面來看,貌似 StatelessWidgetStatefulWidget 差別不是很大,都是在 MyApp 的 build() 方法里返回一個Widget對象,只不過 StatefulWidget 需要額外設(shè)置實現(xiàn)一個 createState() 方法而已。實際上,兩者的區(qū)別非常大。 StatelessWidget 整個生命周期里都不會改變,所以 build 方法只會執(zhí)行一次。而 StatefulWidget 只要狀態(tài)改變,就會調(diào)用 build() 方法重新創(chuàng)建 UI。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容