Flutter : 圖片, 動(dòng)畫, 異步, 手勢檢測, 主題及文字的處理

Image Widget

    1. Image Widget簡介
    • 屏幕快照 2019-06-13 下午2.52.33.png
    1. 支持的圖片格式
    • 屏幕快照 2019-06-13 下午2.53.15.png
    1. 如何加載網(wǎng)絡(luò)圖片
    • 屏幕快照 2019-06-13 下午2.54.36.png
    1. 如何加載靜態(tài)圖片, 以及處理不同分辨率的圖片
    • 聲明圖片路徑
    • 使用AssetImage / Image.asset訪問圖圖片
    1. 如何加載本地圖片
    • 加載完整路徑的本地圖片
    • 加載相對(duì)路徑的本地圖片
    1. 如何設(shè)置placeholder

    為了設(shè)置Placeholder我們需要借助FadeInImage, 它能夠從內(nèi)存, 本地資源中加載placeholder

    • 從內(nèi)存中加載placeholder
    • 從本地資源中加載placeholder
    1. 如何配置圖片緩存
    • 屏幕快照 2019-06-13 下午3.25.32.png
    1. 如何加載Icon
    • Icon的使用
    • 具體代碼
    • 自定義的Icon

Flutter : 動(dòng)畫

    1. 在Flutter中有哪些動(dòng)畫?
    • 屏幕快照 2019-06-19 上午10.11.07.png
    1. 如何使用動(dòng)畫庫中的基礎(chǔ)類給widget添加動(dòng)畫?
    • 屏幕快照 2019-06-19 上午10.12.16.png
    • Animation
    • CurvedAnimation
    • AnimationController
    • AnimationController注意事項(xiàng)
    • Tween
    • Tween.animate
    1. 為widget添加動(dòng)畫
    • 代碼示例
    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    import 'package:flutter/widgets.dart';
    
    class AnimateDemoPage extends StatefulWidget {
      AnimateDemoPage({Key key}) : super(key: key);
    
      _AnimateDemoPageState createState() => _AnimateDemoPageState();
    }
    
    class _AnimateDemoPageState extends State<AnimateDemoPage>
        with SingleTickerProviderStateMixin {
      Animation<double> animation;
      AnimationController controller;
      AnimationStatus animationState;
      double animationValue;
      @override
      void initState() {
        super.initState();
        controller =
            AnimationController(duration: const Duration(seconds: 2), vsync: this);
        animation = Tween<double>(begin: 0, end: 300).animate(controller)
          ..addListener(() {
            setState(() {
              animationValue = animation.value;
            });
          })
          ..addStatusListener((AnimationStatus status) {
            setState(() {
              animationState = status;
            });
          });
      }
      
      @override
      void dispose() {
        // TODO: implement dispose
        controller.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Container(
          margin: EdgeInsets.only(top: 100),
          child: Column(
            children: <Widget>[
              GestureDetector(
                onTap: (){
                  controller.reset();
                  controller.forward();
                },
                child: Text('Start', textDirection: TextDirection.ltr,),
              ),
              Text('State: ' + animationState.toString(), textDirection: TextDirection.ltr,),
              Text('Value: ' + animationValue.toString(), textDirection: TextDirection.ltr,),
              Container(
                height: animation.value,
                width: animation.value,
                color: Colors.red,
                child: Icon(Icons.fullscreen, color: Colors.blue,),
              )
            ],
          ),
        );
      }
    }
    
    1. 如何為動(dòng)畫提供監(jiān)聽器
    • 屏幕快照 2019-06-19 上午10.31.14.png
    1. 用AnimatedWidget與AnimatedBuilder簡化和重構(gòu)我們對(duì)動(dòng)畫的使用
    • 什么是AnimatedWidget?
    • 代碼示例
    class AnimatedLogo extends AnimatedWidget  {
      const AnimatedLogo({Key key, Animation<double> animation}) : super(key: key, listenable: animation);
    
      @override
      Widget build(BuildContext context) {
        final Animation<double> animation = listenable;
        return Center(
          child: Container(
            margin: new EdgeInsets.symmetric(vertical: 10.0),
            height: animation.value,
            width: animation.value,
            child:  new Text('測試'),
          ),
        );
      }
    }
    
    class LogoApp extends StatefulWidget  {
      LogoApp({Key key}) : super(key: key);
    
      _LogoAppState createState() => _LogoAppState();
    }
    
    class _LogoAppState extends State<LogoApp> with SingleTickerProviderStateMixin {
      Animation<double> animation;
      AnimationController controller;
    
      AnimationStatus animationState;
      double animationValue;
      @override
      void initState() {
        super.initState();
        controller =
            new AnimationController(duration: const Duration(seconds: 2), vsync: this);
        animation = Tween<double>(begin: 0, end: 300).animate(controller)
          controller.forward();
      }
      
      @override
      void dispose() {
        // TODO: implement dispose
        controller.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return AnimatedLogo(animation: animation,);
      }
    }
    
    1. AnimatedBuilder
    • AnimatedBuilder概述
    • AnimatedBuilder樹狀圖
    • 代碼示例
    class LogoApp extends StatefulWidget  {
      LogoApp({Key key}) : super(key: key);
    
      _LogoAppState createState() => _LogoAppState();
    }
    
    class _LogoAppState extends State<LogoApp> with SingleTickerProviderStateMixin {
      Animation<double> animation;
      AnimationController controller;
    
      AnimationStatus animationState;
      double animationValue;
      @override
      void initState() {
        super.initState();
        controller =
            new AnimationController(duration: const Duration(seconds: 2), vsync: this);
        animation = Tween<double>(begin: 0, end: 300).animate(controller);
        controller.forward();
      }
      
      @override
      void dispose() {
        // TODO: implement dispose
        controller.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return 
        GrowTransition(
          childWidget: LogoWidget(),
          animation: animation,
        );
        // return AnimatedLogo(animation: animation,);
      }
    }
    
    class LogoWidget extends StatelessWidget {
      const LogoWidget({Key key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Container(
          margin: EdgeInsets.symmetric(vertical: 10),
          child: Text('LogoWidget'),
        );
      }
    }
    
    
    class GrowTransition extends StatelessWidget {
      const GrowTransition({this.animation, this.childWidget});
    
      final Widget childWidget;
      final Animation<double> animation;
      @override
      Widget build(BuildContext context) {
        return Center(
          child: AnimatedBuilder(
            animation: animation,
            builder: (context, child) => Container(
              height: animation.value,
              width: animation.value,
              child: child,
            ),
            child: childWidget,
          ),
        );
      }
    }
    
    1. Hero動(dòng)畫
    • Hero動(dòng)畫概述
    • 代碼示例
    import 'package:flutter/material.dart';
    
    class HeroAnimation extends StatelessWidget {
      const HeroAnimation({Key key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        double timeDilation = 10.0;
        return Scaffold(
          appBar: AppBar(
            title: Text('Basic Hero Animation'),
          ),
          body: Center(
            child: PhotoHero(
              photo: '',
              width: 300,
              ontap: () {
                Navigator.of(context)
                    .push(MaterialPageRoute<void>(builder: (BuildContext context) {
                  return Scaffold(
                    appBar: AppBar(
                      title: Text('Flippers Page'),
                    ),
                    body: Container(
                      color: Colors.lightBlueAccent,
                      padding: EdgeInsets.all(15.0),
                      alignment: Alignment.topLeft,
                      child: PhotoHero(
                          photo: '',
                          width: 300,
                          ontap: () {
                            Navigator.of(context).pop();
                          }),
                    ),
                  );
                }));
              },
            ),
          ),
        );
      }
    }
    
    class PhotoHero extends StatelessWidget {
      final VoidCallback ontap;
      final double width;
      final String photo;
      const PhotoHero({Key key, this.photo, this.width, this.ontap})
          : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return SizedBox(
          width: width,
          child: Hero(
            tag: photo, // 關(guān)聯(lián)兩個(gè)動(dòng)畫的標(biāo)識(shí)
            child: Material(
              color: Colors.transparent,
              child: InkWell(
                onTap: ontap,
                child: Image.network(photo, fit: BoxFit.contain),
              ),
            ),
          ),
        );
      }
    }
    
    

Flutter的異步代碼

    1. 如何編寫異步的代碼?
    • async/await & Isolate
    • async/await的使用
    1. 如何把工作放到后臺(tái)線程執(zhí)行?
    • async/await關(guān)鍵字
    • Isolate的使用方法
    • Isolate代碼示例
    • Isolate代碼示例
    1. 如何進(jìn)行網(wǎng)絡(luò)請(qǐng)求
    • http網(wǎng)絡(luò)請(qǐng)求使用
    1. 如何為長時(shí)間運(yùn)行的任務(wù)添加一個(gè)進(jìn)度指示器?
    • ProgressIndicator的使用
    • 代碼示例 - 1
    • 代碼示例 - 2

手勢檢測 / 觸摸事件處理

    1. 如何給Flutter的widget添加一個(gè)點(diǎn)擊事件的監(jiān)聽?
    • 第一種方法
    • 第二種方法
    1. 如何處理widget上的其他手勢?
    • 屏幕快照 2019-06-25 上午10.50.36.png

主題和文字處理

    1. 如何在Text widget上設(shè)置自定義字體?
    • 添加字體
    • 使用字體
    1. 如何在Text上定義樣式?
    • Text的屬性
    1. 如何給App設(shè)置主題?
    • 主題概述
    • 代碼示例

Flutter調(diào)試技巧

    1. 調(diào)試技巧概述:
    • Flutter調(diào)試技巧
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末媒咳,一起剝皮案震驚了整個(gè)濱河市弛房,隨后出現(xiàn)的幾起案子改览,更是在濱河造成了極大的恐慌部念,老刑警劉巖缘滥,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異金砍,居然都是意外死亡斥铺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門卖漫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來费尽,“玉大人,你說我怎么就攤上這事羊始『涤祝” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵突委,是天一觀的道長柏卤。 經(jīng)常有香客問我,道長匀油,這世上最難降的妖魔是什么缘缚? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮敌蚜,結(jié)果婚禮上桥滨,老公的妹妹穿的比我還像新娘。我一直安慰自己弛车,他們只是感情好齐媒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纷跛,像睡著了一般喻括。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贫奠,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天唬血,我揣著相機(jī)與錄音,去河邊找鬼唤崭。 笑死拷恨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谢肾。 我是一名探鬼主播腕侄,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了兜挨?” 一聲冷哼從身側(cè)響起膏孟,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤医舆,失蹤者是張志新(化名)和其女友劉穎埋同,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窑邦,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡噪舀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年魁淳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片与倡。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡界逛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纺座,到底是詐尸還是另有隱情息拜,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布净响,位于F島的核電站少欺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏馋贤。R本人自食惡果不足惜赞别,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望配乓。 院中可真熱鬧仿滔,春花似錦、人聲如沸犹芹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽羽莺。三九已至实昨,卻和暖如春洞豁,著一層夾襖步出監(jiān)牢的瞬間盐固,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工丈挟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刁卜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓曙咽,卻偏偏與公主長得像蛔趴,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子例朱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容