• <ul id="cgeq2"></ul>
  • 歡迎您光臨深圳塔燈網絡科技有限公司!
    電話圖標 余先生:13699882642

    網站百科

    為您解碼網站建設的點點滴滴

    Flutter從零到∞學習筆記

    發表日期:2018-10 文章編輯:小燈 瀏覽次數:1746

    1. 有狀態widget:StatefulWidget和無狀態widget:StatelessWidget 前者不需要實現Widget build(BuildContext context)。

      具體的選擇取決于widget是否需要管理一些狀態

    2. 在Dart語言中使用下劃線前綴標識符,會強制其變成私有的。

    3. Icons.favorite Icons類里面有很多默認圖標

    4. isOdd 是否奇數 2.isOdd -> false 1.isOdd -> true

    5. pushSaved “”開頭的自動轉成私有(方法和變量)

    6. 導航欄添加按鈕和事件

     @overrideWidget build(BuildContext context) {return new Scaffold(appBar: new AppBar(title: new Text('Startup Name Generator'),actions: <Widget>[// AppBar 添加一個按鈕 樣式為list 事件是_pushSavednew IconButton(icon: new Icon(Icons.list), onPressed: _pushSaved)],),body: _buildSuggestions(),);}// tooltip 長時間按下的提示文字IconButton(icon: new Icon(Icons.search), tooltip: 'Search', onPressed: null)
    1. 界面跳轉方法
    Navigator.of(context).push(new MaterialPageRoute(builder: (context) {},),); 
    1. 一行函數寫法
    // 多行void main() {runApp(new Center(child: new Text('Hello, world!',textDirection: TextDirection.ltr,),))}// 一行void main() => runApp(new MyApp()); 
    1. // Material 是UI呈現的“一張紙”

    2. 請確保在pubspec.yaml文件中,將flutter的值設置為:uses-material-design: true。這允許我們可以使用一組預定義Material icons。

    3. Row(橫向排列)和Column(縱向排列)

    child: new Row(children: <Widget>[new ...,new ...,new ...,],) 
    child: new Column(children: <Widget>[new ...,new ...,new ...,],), 
    1. cached_network_image 圖片占位和淡入淡出

    2. push

    Navigator.push(context,new MaterialPageRoute(builder: (context) => new 新界面),);// 如果需要傳值:新界面({Key key, @required this.接收字段的名字}) : super(key: key);popNavigator.pop(context); 
    1. dio網絡請求https://github.com/flutterchina/dio

    2. import 'dart:convert'; // package將響應內容轉化為一個json Map

    3. // 使用fromJson工廠函數,將json Map 轉化為一個Post對象

    new Post.fromJson(json); 
    1. future參數是一個異步的網絡請求

    2. import 'dart:io'; // 添加請求的headers

    3. // 長連接

    import 'package:web_socket_channel/io.dart';import 'package:multi_server_socket/multi_server_socket.dart'; 
    1. // 網絡請求
    Future<Post> fetchPost() async {final response = await http.get('[http://jsonplaceholder.typicode.com/posts/1](http://jsonplaceholder.typicode.com/posts/1)');final responseJson = json.decode(response.body);return new Post.fromJson(responseJson);}// 請求添加headers/*Future<Post> fetchPost() async {final response = await http.get('[https://jsonplaceholder.typicode.com/posts/1](https://jsonplaceholder.typicode.com/posts/1)',headers: {HttpHeaders.AUTHORIZATION: "Basic your_api_token_here"},);final json = jsonDecode(response.body);return new Post.fromJson(json);}*/new FutureBuilder<Post>(future: fetchPost(),builder: (context, snapshot) {return new CircularProgressIndicator();}) 
    1. 長連接
    // 連接長連接IOWebSocketChannel.connect('[ws://echo](ws://echo/).[websocket.org](http://websocket.org/)’)// 接收消息new StreamBuilder(stream: widget.channel.stream,builder: (context, snapshot) {return new Padding(child: new Text(snapshot.hasData ? '${snapshot.data}' : ''),padding: const EdgeInsets.symmetric(vertical: 20.0));})// 發送消息widget.channel.sink.add(_textController.text);// 關閉長連接widget.channel.sink.close(); 
    1. 在Flutter中添加資源和圖片

    https://flutterchina.club/assets-and-images/

    1. 標準widget:
    Container添加 padding, margins, borders, background color, 或將其他裝飾添加到widget.GridView將 widgets 排列為可滾動的網格.ListView將widget排列為可滾動列表Stack將widget重疊在另一個widget之上.Material Components:Card將相關內容放到帶圓角和投影的盒子中。ListTile將最多3行文字,以及可選的行前和和行尾的圖標排成一行 
    1. pubspec.yaml中添加字體 注意縮進對齊 注意縮進對齊 注意縮進對齊
    -asset 路徑是與pubspec.yaml平級的文件路徑flutter:# Include the Material Design fonts.uses-material-design: truefonts:- family: Rock Saltfonts:# [https://fonts.google.com/specimen/Rock+Salt](https://fonts.google.com/specimen/Rock+Salt)- asset: fonts/Arial-Unicode.ttf- family: VT323fonts:# [https://fonts.google.com/specimen/VT323](https://fonts.google.com/specimen/VT323)- asset: fonts/Arial-Unicode.ttf- family: Ewertfonts:# [https://fonts.google.com/specimen/Ewert](https://fonts.google.com/specimen/Ewert)- asset: fonts/Ewert-Regular.ttf 
    1. 比如一個關閉按鈕在
    new Row(mainAxisAlignment: MainAxisAlignment.end, children: <Widget>[new FlatButton(onPressed: () {}, child: Icon(Icons.close))],); 
    1. 分割線
    new Divider(color: Colors.lightBlue,)
    1. 自定義Icon
    new Image.asset(“圖片路徑", width: 20.0, height: 20.0,) 
    1. 按鈕寬高
    001、new Padding(padding: new EdgeInsets.fromLTRB(48.0, 20.0, 48.0, 20.0),child: new Row(children: <Widget>[new Expanded(child:new RaisedButton(onPressed: (){},//設置控件的高度child: new Padding(padding: new EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 10.0),child: new Text("登錄",style: TextStyle(color: Colors.white)),),color: Colors.brown,),),],),),002、new Container(width: MediaQuery.of(context).size.width - 48 * 2 ,padding: new EdgeInsets.only(top: 40.0),child: new RaisedButton(onPressed: (){},//設置控件的高度child: new Padding(padding: new EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 10.0),child: new Text("登錄",style: TextStyle(color: Colors.white)),),color: Colors.brown,),),003、Widget _bigButton(String text, double lSpace, double rSpace) {return new Container(width: MediaQuery.of(context).size.width - lSpace - rSpace,height: 48.0,margin: new EdgeInsets.only(left: lSpace, right: rSpace),color: Colors.white54,padding: new EdgeInsets.only(top: 0.0),child: new RaisedButton(onPressed: (){print(text);},child: new Padding(padding: new EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 0.0),child: new Text(text,style: TextStyle(color: Colors.white)),),color: Colors.brown,),);} 
    1. 設備尺寸
    MediaQuery.of(context).size.width 
    1. 設備像素密度
    MediaQuery.of(context).devicePixelRatio 
    1. 狀態欄高度
    MediaQuery.of(context).padding.top 
    1. 擔心鍵盤擋住控件,可以使用 SingleChildScrollView,將SingleChildScrollView當做容器。

    2. 一個超級簡單界面

    import 'package:flutter/material.dart';class RegisterPage extends StatelessWidget {@overrideWidget build(BuildContext context) {return new Scaffold(backgroundColor: Colors.black,body: new RegisterWidget(),);}}class RegisterWidget extends StatefulWidget {RegisterWidgetState createState() => RegisterWidgetState();}class RegisterWidgetState extends State<RegisterWidget> {@overrideWidget build(BuildContext context) {return new Text("RegisterPage", style: TextStyle(color: Colors.white),);}} 
    1. Flutter 按鈕總結
    · InkWell // 純文字按鈕· OutLineButton // 邊框按鈕· IconButton// icon按鈕·
    1. import 'package:flutter/services.dart';
    TextFieldinputFormatters: <TextInputFormatter> [WhitelistingTextInputFormatter.digitsOnly,], 
    1. 以上已經添加

    2. 驗證碼按鈕

    new Positioned(child: new Container(width: 80.0,height: 27.0,alignment: Alignment.center,decoration: new BoxDecoration(border: new Border.all(color: Colors.white,width: 1.0,),borderRadius: new BorderRadius.circular(4.0),),child: InkWell(child: _mText(_verifyStr, 12.0),onTap: () {},),)), 
    1. 倒計時方法
    @overridevoid dispose() {super.dispose();_cancelTimer();}_startTimer() {if (_verifyStr == '重新發送' || _verifyStr == '獲取驗證碼') {_seconds = 5;_timer = new Timer.periodic(new Duration(seconds: 1), (timer) {if (_seconds == 0) {_cancelTimer();return;}_seconds--;_verifyStr = '$_seconds(s)';setState(() {});if (_seconds == 0) {_verifyStr = '重新發送';}});}}_cancelTimer() {_timer?.cancel();} 
    1. 富文本拼接: 協議
    Widget _protocolWidget() {return new Container(child: new Row(children: <Widget>[new GestureDetector(onTap: () {print("選擇");},child: Icon(Icons.add_alert, color: Colors.white),),new Text.rich(new TextSpan(text: '我已閱讀并同意',style: new TextStyle(fontSize: 12.0,color: Colors.grey[500],fontWeight: FontWeight.w400,),children: [new TextSpan(recognizer: new TapGestureRecognizer()..onTap = () {print("《燎原用戶服務協議》");},text: "《燎原用戶服務協議》",style: new TextStyle(fontSize: 14.0,color: Color(0XFFB57A36),fontWeight: FontWeight.w400,),)])),],));} 
    1. 陰影、圓角
    new Card(elevation: 4.0,shape: new RoundedRectangleBorder(borderRadius: BorderRadius.only(topLeft: Radius.circular(16.0),topRight: Radius.circular(16.0),bottomLeft: Radius.circular(12.0),bottomRight: Radius.circular(2.0),)),child: new IconButton(icon: Icon(Icons.add), onPressed: () {}),) 
    1. YYTabbarWidget
    import 'package:flutter/material.dart';// with AutomaticKeepAliveClientMixinclass YYTabbarWidget extends StatefulWidget {List<Widget> tabItems = [];Widget title;List<Widget> tabViews = [];PageController pageController;final ValueChanged<int> onPageChanged;final Widget drawer;YYTabbarWidget({Key key,this.drawer,this.tabItems,this.title,this.tabViews,this.pageController,this.onPageChanged,}) : super(key: key);_YYTabbarWidgetState createState() => _YYTabbarWidgetState(drawer, title, tabItems, tabViews, pageController, onPageChanged);}class _YYTabbarWidgetState extends State<YYTabbarWidget> with SingleTickerProviderStateMixin {final Widget _title;final List<Widget> _tabViews;final List<Widget> _tabItems;final ValueChanged<int> _onPageChanged;final Widget _drawer;_YYTabbarWidgetState(this._drawer,this._title,this._tabItems,this._tabViews,this._pageController,this._onPageChanged,) : super();TabController _tabController;PageController _pageController;@overridevoid initState() {super.initState();_tabController = new TabController(length: _tabItems.length, vsync: this);}@overridevoid dispose() {_tabController.dispose();super.dispose();}_renderTab() {print(_tabItems);List<Widget> list = new List();for (int i = 0; i < _tabItems.length; i++) {list.add(new FlatButton(onPressed: () {print(i);_pageController.jumpTo(MediaQuery.of(context).size.width * i);}, child: _tabItems[I],));}return list;}@overrideWidget build(BuildContext context) {return new Scaffold(drawer: _drawer,appBar: new AppBar(title: _title,),body: new PageView(controller: _pageController,children: _tabViews,onPageChanged: (index) {_tabController.animateTo(index);_onPageChanged?.call(index);},),bottomNavigationBar: new Material(color: Colors.white,child: new TabBar(indicatorPadding: new EdgeInsets.only(top: 0.0),controller: _tabController,tabs: _renderTab(),indicatorColor: Colors.red,),),);}} 
    1. ListView 添加刷新,當數量少的時候不能滾動
    physics: new AlwaysScrollableScrollPhysics(), // 讓ListView一直可以滾動 
    1. tabView切換 子界面都會調用initState
    解決:AutomaticKeepAliveClientMixinclass HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin {@overridebool get wantKeepAlive => true;} 
    1. 路有跳轉
    ///不帶參數的路由表跳轉Navigator.pushNamed(context,routeName);///跳轉新頁面并且替換,比如登錄頁跳轉主頁Navigator.pushReplacementNamed(context,routeName);///跳轉到新的路由,并且關閉給定路由的之前的所有頁面Navigator.pushNamedAndRemoveUntil(context,'/calendar',ModalRoute.withName('/'));///帶參數的路由跳轉,并且監聽返回Navigator.push(context,newMaterialPageRoute(builder:(context)=>newNotifyPage())).then((res){///獲取返回處理}); 
    1. flutter lib
    cupertino_icons: ^0.1.2#iconflutter_spinkit: "^2.1.0"# load more loadingimport 'package:flutter_spinkit/flutter_spinkit.dart';dio: x.x.x#無網絡請求import 'package:dio/dio.dart'; 
    1. dio網絡請求示例
    _dioRequest() async {Dio dio = new Dio();Response response;try {String url;var params; // 請求參數Options options; // 配置:超時,請求頭,請求類型等response = await dio.request(url, data: params, options: options);} on DioError catch(e) {// 請求出錯時,返回一個DioError對象}} 
    1. build_runner的使用
    1、在根目錄運行2、一次性創建.g.dart文件 使用build 此時目錄內不能有.g.dart文件3、watch是監聽 有model類的文件創建 自動創建.g.dart文件flutter packages pub run build_runner buildflutter packages pub run build_runner watch 

    本頁內容由塔燈網絡科技有限公司通過網絡收集編輯所得,所有資料僅供用戶學習參考,本站不擁有所有權,如您認為本網頁中由涉嫌抄襲的內容,請及時與我們聯系,并提供相關證據,工作人員會在5工作日內聯系您,一經查實,本站立刻刪除侵權內容。本文鏈接:http://www.juherenli.com/17619.html
    相關APP開發
     八年  行業經驗

    多一份參考,總有益處

    聯系深圳網站公司塔燈網絡,免費獲得網站建設方案及報價

    咨詢相關問題或預約面談,可以通過以下方式與我們聯系

    業務熱線:余經理:13699882642

    Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.    

    亚洲国产精品无码久久九九| 97久久精品无码一区二区| 国产成人亚洲精品无码AV大片| 99精品久久99久久久久| 精品国产国产综合精品| 精品无码成人网站久久久久久| 精品亚洲成A人无码成A在线观看| 国语自产偷拍精品视频偷蜜芽| 国产啪精品视频网站丝袜| 亚洲精品免费网站| 久久九九精品99国产精品| 亚洲精品无码成人AAA片| 日本免费精品一区二区三区| 国产精品第20页| jizz国产精品jizz中国| 亚洲AV无码国产精品麻豆天美 | 精品亚洲永久免费精品| 国产精品人人做人人爽| 国产精品熟女视频一区二区| 国产精品无码久久四虎| 久久91精品国产91久| 蜜臀98精品国产免费观看| 亚洲精品私拍国产福利在线| 久久精品国产亚洲av麻| 中文字幕无码久久精品青草| 国产精品 综合 第五页| 日韩精品一区二三区中文| 国产亚洲午夜精品| 国产真实伦偷精品| 国产成人不卡亚洲精品91| 国产精品久久久久久无毒不卡 | 日韩精品亚洲专区在线观看| 欧洲精品免费一区二区三区| 日本加勒比久久精品| 国产在线精品一区二区在线看 | 亚洲日韩精品国产一区二区三区| 91精品国产福利在线导航| 国产老女人精品免费视频| 大伊香蕉在线精品视频人碰人| 欧美成人精品三级网站下载| 国内精品视频一区二区八戒|