Flower_gift 簡單的Flutter實戰(zhàn)app(二)

0001.jpg
項目git地址:flower_gift
首頁導(dǎo)航部分編寫

完成效果:


3333.gif
首頁數(shù)據(jù)provide

數(shù)據(jù)模型化用的是:FlutterJsonBeanFactory(Android Studio插件)
數(shù)據(jù)模型(model/homePage_model_entity)

class HomePageModelEntity {
    List<HomePageModelImage> images;
    HomePageModelKformember kfOrmember;
    HomePageModelComments comments;
    String recommendTitle;
    HomePageModelMsgcenter msgcenter;
    List<HomePageModelFlowercategory> flowercategory;
    HomePageModelSection1 section1;
    HomePageModelSection2 section2;
    HomePageModelSection3 section3;
    HomePageModelSection4 section4;
    int commentCount;
    HomePageModelSection5 section5;
    List<HomePageModelNavtop> navtop;
    HomePageModelSection6 section6;
    HomePageModelCustomerservice customerService;
    List<HomePageModelRecommand2> recommend2;
    List<HomePageModelRecommand3> recommend3;
    List<HomePageModelFlowercategory2> flowercategory2;

    HomePageModelEntity({this.images, this.kfOrmember, this.comments, this.recommendTitle, this.msgcenter, this.flowercategory, this.section1, this.section2, this.section3, this.section4, this.commentCount, this.section5, this.navtop, this.section6, this.customerService, this.recommend2, this.recommend3, this.flowercategory2}); 
.........

首頁數(shù)據(jù)請求provide(provide/homePage_provide.dart)

import 'package:flower_gift/model/homePage_model_entity.dart';
import "package:flutter/material.dart";
import 'package:flutter/widgets.dart';
import '../service/service_http_method.dart';
import 'dart:convert';

class HomePageProvide with ChangeNotifier {
  HomePageModelEntity homePageModelEntity;

  //后臺獲取數(shù)據(jù)
  getHomePageData(){
    requestGet("shouye").then((val){
       var responseData = json.decode(val.toString());
       homePageModelEntity = HomePageModelEntity.fromJson(responseData);
       notifyListeners();
    });
  }

}

注冊provide(main.dart)

void main() {
  var providers = Providers();
  var tabBarTapProvide = TabBarTapProvide();
  var homePageProvide = HomePageProvide();
  //狀態(tài)管理注冊
  providers
  ..provide(Provider<TabBarTapProvide>.value(tabBarTapProvide))
  ..provide(Provider<HomePageProvide>.value(homePageProvide));
  runApp(
    ProviderNode(
      child: MyApp(),
      providers: providers,
    )
  );
}
分子組件編寫首頁

1.頂部輪播(pages/homeSubWidget/home_topSwiper_widget.dart)

import 'package:flutter/material.dart';
import 'package:flutter_swiper/flutter_swiper.dart';
import 'package:provide/provide.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import '../../provide/homePage_provide.dart';


class HomeSwiper extends StatelessWidget {
  

  @override
  Widget build(BuildContext context) {
   
    return Provide<HomePageProvide>(
        builder: (context,child,val){
        var  swiperDataList = val.homePageModelEntity.images;
              return Container(
                  height: ScreenUtil().setHeight(386),
                  child: Swiper(
                    itemBuilder: (BuildContext context,int index){
                        return Image.network("${swiperDataList[index].image}");
                    },
                    onTap: (index){
                        print("點擊了輪播組件:${index}");
                    },
                    itemCount: swiperDataList.length,
                    pagination: buildSwiperPagintion(),
                    autoplay: true,
                    
                  ),
                );
        },
    );
  }

  //自己配置的分頁指示器
  buildSwiperPagintion(){
     return SwiperPagination(
        builder: DotSwiperPaginationBuilder(
           color: Colors.white,
           activeColor: Colors.orange
        )
     );
  }

}


2.標簽組件(pages/homeSubWidget/home_smallTag_widget.dart)

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

class HomeSmallTag extends StatelessWidget {
  final List tags = ["認證龍頭企業(yè)","14年品牌","3小時送花","最近320673條評論"];

  @override
  Widget build(BuildContext context) {
    return Container(
       padding: EdgeInsets.all(5.0),
       margin: EdgeInsets.only(top: 5.0),
       child: Row(
         mainAxisAlignment: MainAxisAlignment.spaceBetween,
         children: _createWidget(tags)
       ),
    );
  }
 
  List<Widget> _createWidget(List tagList){
     List<Widget> list = new List();
     for(var i = 0; i < tags.length; i++){
       list.add(
          Row(
            children: <Widget>[
              Icon(Icons.check_circle,
                  size: ScreenUtil().setSp(30.0),
                  color: Color.fromRGBO(45, 60, 49, 1.0),
              ), 
              Text("${tags[i]}",
                  style: TextStyle(color: Colors.black45,fontSize: ScreenUtil().setSp(20.0)),
                )
            ],
          )
          
       );
     }
     return list;
  }

}

3.導(dǎo)航組件(pages/homeSubWidget/home_navtop_widget.dart)

import 'package:flutter/material.dart';
import '../../model/homePage_model_entity.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import '../../provide/homePage_provide.dart';
import 'package:provide/provide.dart';

class HomeNavtop extends StatelessWidget {
 
  @override
  Widget build(BuildContext context) {
    
    return Provide<HomePageProvide>(
        builder: (context,child,val){
          var  navtop = val.homePageModelEntity.navtop;
          return Container(
            margin: EdgeInsets.only(top: 10.0),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: _createWidget(navtop),
            ),
          );
        }
     );  
  }
 
 List<Widget> _createWidget(List<HomePageModelNavtop> navtop){
     List<Widget> list = new List();
     for(var i = 0; i < navtop.length; i++){
       list.add(
           Container(
             width: ScreenUtil().setWidth(70),
             child: InkWell(
               onTap: (){
                 print("點擊頂部導(dǎo)航item");
               },
               child: Column(
                 children: <Widget>[
                   Image.network(navtop[i].image),
                   Container(
                      margin: EdgeInsets.only(top: 5.0),
                      child:Text("${navtop[i].title}",
                            style: TextStyle(fontSize: ScreenUtil().setSp(22),
                            ),
                      ) ,
                   )
                   
                ],
              ), 
             )
          )
       );
     }
     return list;
  }

}

4.分類組件(pages/homeSubWidget/home_flowerCategory_widget.dart)

import 'package:flutter/material.dart';
import 'package:flutter/painting.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import '../../model/homePage_model_entity.dart';
import 'package:provide/provide.dart';
import '../../provide/homePage_provide.dart';

class HomeFlowerCategroy extends StatelessWidget {
 

  @override
  Widget build(BuildContext context) {
    return Provide<HomePageProvide>(
        builder: (context,child,val){
          var homePageModelEntity = val.homePageModelEntity;
            return Container(
              margin: EdgeInsets.only(top: 10.0),
              child: Column(
                children: <Widget>[
                  _titleWidget(homePageModelEntity),
                  _firstFlowerCategory(homePageModelEntity.flowercategory),
                  _twoFlowerCategory(homePageModelEntity.flowercategory2),
                  _oneRecommend(homePageModelEntity.recommend2),
                  _twoRecommend(homePageModelEntity.recommend3)
                ],
              ),
            );
        }
    );     
  }
  

  //標題組件>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  Widget _titleWidget(HomePageModelEntity entity){
    return Container(
        padding: EdgeInsets.only(left: 15.0),
        alignment: Alignment.centerLeft,
        child: Text(
          entity.recommendTitle,
          style: TextStyle(
            color: Colors.orange
          ),
        ),
    );
  }

  //flowerCategory one 組件>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  Widget _firstFlowerCategory(List<HomePageModelFlowercategory> flowerCategory){
    return Container(
       margin: EdgeInsets.only(top: 10.0),
       child: Row(
         mainAxisAlignment: MainAxisAlignment.spaceAround,
         children: _firstFlowerCategoryList(flowerCategory),
       ),
    );
  }

  List<Widget> _firstFlowerCategoryList(List<HomePageModelFlowercategory> flowerCategory){
      List<Widget> list = new List();
     for(var i = 0; i < flowerCategory.length; i++){
       list.add(
          _firstFlowerCategoryItem(flowerCategory[i])
       );
     }
     return list;
  }
  Widget _firstFlowerCategoryItem(HomePageModelFlowercategory flowerCategoryItem){
      return ClipRRect(
          borderRadius:BorderRadius.circular(8.0),
          child: Container(
              width:ScreenUtil().setWidth(226.0),
              //  height: 160.0,
              child: InkWell(
                onTap: (){
                  print("點擊了flowerCategoryItem...");
                },
                child: Stack(
                      alignment: const FractionalOffset(0.5, 0.1),
                      children: <Widget>[
                        Image.network(flowerCategoryItem.image),
                        Text(flowerCategoryItem.title),
                        
                      ],
                  ),
              )
              
            ),

      );
      
      
  }


  //flowerCategory two 組件>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  Widget _twoFlowerCategory(List<HomePageModelFlowercategory2> flowerCategory2){
    return Container(
       margin: EdgeInsets.only(top: 5.0),
       child: Row(
         mainAxisAlignment: MainAxisAlignment.spaceAround,
         children: _twoFlowerCategoryList(flowerCategory2),
       ),
    );
  }

  List<Widget> _twoFlowerCategoryList(List<HomePageModelFlowercategory2> flowerCategory2){
      List<Widget> list = new List();
     for(var i = 0; i < flowerCategory2.length; i++){
       list.add(
          _twoFlowerCategoryItem(flowerCategory2[i])
       );
     }
     return list;
  }
  Widget _twoFlowerCategoryItem(HomePageModelFlowercategory2 flowerCategoryItem){
      return Container(
        
        width:ScreenUtil().setWidth(160.0),
        //  height: 120.0,
         child: InkWell(
           onTap: (){
             print("點擊了flowerCategoryItem2...");
           },
           child: Stack(
                alignment: const FractionalOffset(0.5, 0.1),
                children: <Widget>[
                  Image.network(flowerCategoryItem.image),
                  Text(flowerCategoryItem.title),
                ],
            ),
         )
         
      );
  }
   //recommend one 組件>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    Widget _oneRecommend(List<HomePageModelRecommand2> recommend2){
    return Container(
       margin: EdgeInsets.only(top: 15.0),
       child: Row(
         mainAxisAlignment: MainAxisAlignment.spaceAround,
         children: _oneRecommendList(recommend2),
       ),
    );
  }

  List<Widget> _oneRecommendList(List<HomePageModelRecommand2> recommend2){
      List<Widget> list = new List();
     for(var i = 0; i < recommend2.length; i++){
       list.add(
          _oneRecommendItem(recommend2[i])
       );
     }
     return list;
  }
  Widget _oneRecommendItem(HomePageModelRecommand2 recommendItem){
      return Expanded(
        child: Container(
         decoration: BoxDecoration(
            border: Border.all(width: 0.5,color: Colors.black12)
         ),
         width:ScreenUtil().setWidth(360.0),
         child: InkWell(
           onTap: (){
             print("點擊了recommendItem2...");
           },
           child: Row(
             children: <Widget>[
                _oneRecommendItemLeft(recommendItem),
                _oneRecommendItemRight(recommendItem)
             ],
           )
         
         ) 
       ),
      );
      
      
  }
  Widget _oneRecommendItemLeft(HomePageModelRecommand2 recommendItem){
        return Container(
           width: ScreenUtil().setWidth(180.0),
           child: Column(
              children: <Widget>[
                Text("${recommendItem.title}"),
                Container(
                  margin: EdgeInsets.only(top: 5.0),
                  child: Text("${recommendItem.desc}",
                  style: TextStyle(color: Colors.black26,fontSize: ScreenUtil().setSp(22.0)), 
                )
               ),
                Container(
                  margin: EdgeInsets.only(top: 38.0),
                  child: ClipRRect(
                      borderRadius: BorderRadius.circular(10.0),
                      child: Container(
                          width: ScreenUtil().setWidth(160.0),
                          height: ScreenUtil().setHeight(30.0),
                          color: Colors.orange,
                          alignment: Alignment.center,
                          child: Text("${recommendItem.redWord}",
                          style: TextStyle(
                              color: Colors.white,
                              fontSize: ScreenUtil().setSp(22.0)
                          ),
                          ),
                        ),
                    ),
                )
                
                
              ],
           ),
        );
  } 
  Widget _oneRecommendItemRight(HomePageModelRecommand2 recommendItem){
    bool isSales;
    isSales = recommendItem.sales.length > 0 ? true : false;
    return Container(
       width: ScreenUtil().setWidth(180.0),
       child: Column(
          children: <Widget>[
             Image.network(recommendItem.image),
             isSales ? Text("熱銷${recommendItem.sales}束") : Row(
               children: <Widget>[
                 Text("¥${recommendItem.price}"),
                 Text("¥${recommendItem.linePrice}",
                 style: TextStyle(
                    color: Colors.black26,
                    decoration: TextDecoration.lineThrough
                 ),
                 )
               ],
             )
          ],
       ),
    );

  }
  

  
   //recommend two 組件>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   Widget _twoRecommend(List<HomePageModelRecommand3> recommend2){
    return Container(
       margin: EdgeInsets.only(top: 15.0),
       child: Row(
         mainAxisAlignment: MainAxisAlignment.spaceAround,
         children: _twoRecommendList(recommend2),
       ),
    );
  }

  List<Widget> _twoRecommendList(List<HomePageModelRecommand3> recommend2){
      List<Widget> list = new List();
     for(var i = 0; i < recommend2.length; i++){
       list.add(
          _twoRecommendItem(recommend2[i])
       );
     }
     return list;
  }
  Widget _twoRecommendItem(HomePageModelRecommand3 recommandItem){
      return Container(
        
         width:ScreenUtil().setWidth(220.0),
        //  height: 160.0,
         child: InkWell(
           onTap: (){
             print("點擊了recommendItem2...");
           },
           child: Stack(
                alignment: const FractionalOffset(0, 1),
                children: <Widget>[
                   
                  Image.network(recommandItem.image),
                  Container(
                       width:ScreenUtil().setWidth(220.0),
                       height: ScreenUtil().setHeight(48.0),
                       alignment: Alignment.center,
                       color: Colors.black38,
                       child: Text(recommandItem.title,
                       style:TextStyle(
                       color: Colors.white
                    )
                   ),
                  )
                ],
            ),
         )
         
      );
  }
}


分類組件寫了些重復(fù)的布局代碼惠呼,也沒有去修改了恳守。 其次就是熱銷和特價專區(qū)布局沒有按照這個原圖做贩虾。 原圖給的鮮花圖片是要做成一張大背景的,然后文字懸浮的缎罢,用Stack布局寫太多了。

下一篇完成首頁的全部編寫.

首頁完成

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屁使,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蔽午,更是在濱河造成了極大的恐慌酬蹋,老刑警劉巖及老,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骄恶,死亡現(xiàn)場離奇詭異,居然都是意外死亡僧鲁,警方通過查閱死者的電腦和手機象泵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來偶惠,“玉大人,你說我怎么就攤上這事绑改。” “怎么了兄一?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長皆的。 經(jīng)常有香客問我蹋盆,道長硝全,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任伟众,我火速辦了婚禮召廷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘竞慢。我一直安慰自己,他們只是感情好筹煮,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布败潦。 她就那樣靜靜地躺著本冲,像睡著了一般劫扒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沟饥,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天贤旷,我揣著相機與錄音澎灸,去河邊找鬼遮晚。 笑死拦止,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的汹族。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼夸政,長吁一口氣:“原來是場噩夢啊……” “哼榴徐!你這毒婦竟也來了匀归?” 一聲冷哼從身側(cè)響起耗帕,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仿便,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗽仪,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡闻坚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鲤氢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡哨颂,死狀恐怖相种,靈堂內(nèi)的尸體忽然破棺而出威恼,到底是詐尸還是另有隱情寝并,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布斤蔓,位于F島的核電站镀岛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏漂羊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一椭豫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赏酥,春花似錦、人聲如沸今缚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至囱淋,卻和暖如春餐塘,著一層夾襖步出監(jiān)牢的瞬間妥衣,已是汗流浹背戒傻。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芦倒,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓兵扬,卻偏偏與公主長得像口蝠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妙蔗,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

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