• 14 Flutter仿京东商城项目 头部搜索导航布局 修改主题 修正ScreenAdapter类


    main.dart

    import 'package:flutter/material.dart';
    import 'routes/router.dart';
    void main() => runApp(MyApp());
    
    class MyApp extends StatefulWidget {
      MyApp({Key key}) : super(key: key);
    
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          // home:Tabs() ,
          debugShowCheckedModeBanner: false,
          initialRoute: '/search', 
          onGenerateRoute:onGenerateRoute,
          theme: ThemeData(
            primaryColor: Colors.white
          ),
        );
      }
    }

    Tabs.dart

    import 'package:flutter/material.dart';
    import '../../services/ScreenAdaper.dart';
    
    import 'Home.dart';
    import 'Cart.dart';
    import 'Category.dart';
    import 'User.dart';
    
    class Tabs extends StatefulWidget {
      Tabs({Key key}) : super(key: key);
    
      _TabsState createState() => _TabsState();
    }
    
    class _TabsState extends State<Tabs> {
      int _currentIndex = 1;
      PageController _pageController;
      void initState() {
        super.initState();
        this._pageController = new PageController(initialPage: this._currentIndex);
      }
    
      List<Widget> _pageList = [HomePage(), CategoryPage(), CartPage(), UserPage()];
      @override
      Widget build(BuildContext context) {
        ScreenAdaper.init(context);
    
        return Container(
          child: Scaffold(
            appBar:_currentIndex!=3?AppBar(
              leading: IconButton(
                icon:
                    Icon(Icons.center_focus_weak, size: 28, color: Colors.black87),
                onPressed: null,
              ),
              title:InkWell(
                child: Container(
                  height: ScreenAdaper.height(56),
                  decoration: BoxDecoration(
                    color: Color.fromRGBO(233,233,233, 0.8),
                    borderRadius: BorderRadius.circular(30)
                  ),
                  child: Row(
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: <Widget>[
                      Icon(Icons.search),
                      Text('笔记本',style:TextStyle(
                        fontSize: ScreenAdaper.size(28)
                      ))
                    ],
                  ),
                ),
                onTap: (){
                  Navigator.pushNamed(context,'/search');
                },
              ),
              actions: <Widget>[
                IconButton(
                  icon: Icon(Icons.message,
                      size: 28, color: Colors.black87),
                  onPressed: null,
                )
              ],
            ):AppBar(
              title: Text('用户中心'),
            ),
            //页面状态保持第一种方法:
            //保持所有的页面状态,使用indexedStack
            // body:IndexedStack(
            //   index: this._currentIndex,
            //   children:_pageList
            // ),
            //保持部分页面的状态:
            //
    
            body: PageView(
              //修改的部分:
              controller: this._pageController,
              children: this._pageList,
              onPageChanged:(index){
                setState(() {
                 this._currentIndex=index; 
                });
              },
              // physics: NeverScrollableScrollPhysics(), //禁止pageView滑动
            ),
            bottomNavigationBar: BottomNavigationBar(
              currentIndex: this._currentIndex,
              onTap: (index) {
                this.setState(() {
                  this._currentIndex = index;
                  this._pageController.jumpToPage(this._currentIndex);
                });
              },
              type: BottomNavigationBarType.fixed,
              fixedColor: Colors.red,
              items: [
                BottomNavigationBarItem(icon: Icon(Icons.home), title: Text('首页')),
                BottomNavigationBarItem(
                    icon: Icon(Icons.category), title: Text('分类')),
                BottomNavigationBarItem(
                    icon: Icon(Icons.shopping_cart), title: Text('购物车')),
                BottomNavigationBarItem(icon: Icon(Icons.people), title: Text('我的'))
              ],
            ),
          ),
        );
      }
    }

    Home.dart

    import 'package:flutter/material.dart';
    
    
    //热门推荐:
    import '../../model/ProductModel.dart';
    import 'package:flutter_swiper/flutter_swiper.dart';
    // import 'dart:convert';
    import '../../services/ScreenAdaper.dart';
    import '../../config/Config.dart';
    import 'package:dio/dio.dart';
    //轮播图类模型:
    import '../../model/FocusModel.dart';
    
    
    
    class HomePage extends StatefulWidget {
      HomePage({Key key}) : super(key: key);
    
      _HomePageState createState() => _HomePageState();
    }
    
    class _HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin {
      //轮播图:
      //flutter run -d all 链接多个设备的命令:
      List _focusData = [];
      List _hotProductList=[];
      List _bestProductList=[];
        @override
      // TODO: implement wantKeepAlive
      bool get wantKeepAlive => true;
      void initState() {
        super.initState();
        _getFocusData();
        _getHotProductData();
        _getBestProductData();
      }
      //获取轮播图数据:
      _getFocusData() async {
        var api = '${Config.domain}api/focus';
        var result = await Dio().get(api);
        var focusList = FocusModel.fromJson(result.data);
        focusList.result.forEach((value) {
          print(value.title);
          print(value.pic);
        });
        setState(() {
          this._focusData = focusList.result;
        });
      }
      //获取猜你喜欢的数据:
      _getHotProductData() async{
        var api='${Config.domain}api/plist?is_hot=1';
        var result=await Dio().get(api);
        var hotProductList=ProductModel.fromJson(result.data);
        setState(() {
         this._hotProductList= hotProductList.result;
        });
      }
      //获取热门推荐的数据:
      _getBestProductData() async{
        var api='${Config.domain}api/plist?is_best=1';
        var result=await Dio().get(api);
        var bestProductList=ProductModel.fromJson(result.data);
        setState(() {
         this._bestProductList= bestProductList.result;
        });
      }
    
      Widget _swiperWidget() {
        // List<Map> imgList = [
        //   {"url": "https://www.itying.com/images/flutter/slide01.jpg"},
        //   {"url": "https://www.itying.com/images/flutter/slide02.jpg"},
        //   {"url": "https://www.itying.com/images/flutter/slide03.jpg"}
        // ];
        if (this._focusData.length > 0) {
          return Container(
            child: AspectRatio(
              aspectRatio: 2 / 1,
              child: Swiper(
                itemBuilder: (BuildContext context, int index) {
                  String pic=this._focusData[index].pic;
                  pic=Config.domain+pic.replaceAll('\', '/');
                  return new Image.network(
                    "${pic}",
                    fit: BoxFit.fill,
                  );
                },
                itemCount: this._focusData.length,
                pagination: new SwiperPagination(),
                control: new SwiperControl(),
                autoplay: true,
              ),
            ),
          );
        } else {
          return Text('加载中~');
        }
      }
    
      //标题:
      Widget _titleWidget(value) {
        return Container(
          height: ScreenAdaper.height(46),
          margin: EdgeInsets.only(left: ScreenAdaper.width(20)),
          padding: EdgeInsets.only(left: ScreenAdaper.width(20)),
          decoration: BoxDecoration(
              border: Border(
                  left: BorderSide(
                      color: Colors.red,  ScreenAdaper.width(10)))),
          child: Text(value, style: TextStyle(color: Colors.black54)),
        );
      }
    
      //热门商品:
      Widget _hotProductListWidget() {
        if(this._hotProductList.length>0){
        return Container(
          height: ScreenAdaper.height(240),
          padding: EdgeInsets.all(ScreenAdaper.width(20)),
          //  double.infinity, //寬度自適應
          child: ListView.builder(
            scrollDirection: Axis.horizontal,
            itemBuilder: (contxt, index) {
    
              String sPic=this._hotProductList[index].sPic;
              sPic=Config.domain+sPic.replaceAll('\', '/');
              return Column(
                children: <Widget>[
                  Container(
                    height: ScreenAdaper.height(140),
                     ScreenAdaper.width(140),
                    margin: EdgeInsets.only(right: ScreenAdaper.width(21)),
                    child: Image.network(
                       "${sPic}",
                      fit: BoxFit.cover),
                  ),
                  Container(
                    padding: EdgeInsets.only(top: ScreenAdaper.height(10)),
                    height: ScreenAdaper.height(44),
                    child: Text(
                      "¥${this._hotProductList[index].price}",
                      style: TextStyle(color: Colors.red),
                      ),
                  )
                ],
              );
            },
            itemCount: this._hotProductList.length,
          ),
        );
      
        }else{
          return Text('暂无热门推荐数据');
        }
    
      }
    
      Widget _recProductListWidget() {
    
    
        var itemWidth = (ScreenAdaper.getScreenWidth() - 30) / 2;
        return         Container(
              padding: EdgeInsets.all(10),
              child: Wrap(
                runSpacing: 10,
                spacing: 10,
                children:this._bestProductList.map((value){
                  //图片:
                  var sPic=value.sPic;
                  sPic=Config.domain+sPic.replaceAll('\','/');
    
        return Container(
          padding: EdgeInsets.all(ScreenAdaper.width(20)),
           itemWidth,
          decoration:
          BoxDecoration(border: Border.all(color: Colors.black12,  1)),
          child: Column(
            children: <Widget>[
              Container(
                 double.infinity,
                child: AspectRatio(
                  aspectRatio: 1 / 1,
                  child: Image.network(
                      "${sPic}",
                      fit: BoxFit.cover),
                ),
              ),
              Padding(
                padding: EdgeInsets.only(top: ScreenAdaper.height(10)),
                child: Text(
                  "${value.title}",
                  maxLines: 2,
                  overflow: TextOverflow.ellipsis,
                  style: TextStyle(color: Colors.black54),
                ),
              ),
              Padding(
                padding: EdgeInsets.only(top: ScreenAdaper.height(20)),
                child: Stack(
                  children: <Widget>[
                    Align(
                      alignment: Alignment.centerLeft,
                      child: Text(
                        "${value.price}",
                        style: TextStyle(color: Colors.red, fontSize: 16),
                      ),
                    ),
                    Align(
                      alignment: Alignment.centerRight,
                      child: Text(
                        "¥${value.oldPrice}",
                        style: TextStyle(
                            color: Colors.black54,
                            fontSize: 16,
                            decoration: TextDecoration.lineThrough),
                      ),
                    )
                  ],
                ),
              )
            ],
          ),
        );
     
    
    
    
                }).toList(),
              ),
            );
    
    
    
      }
    
      @override
      Widget build(BuildContext context) {
        ScreenAdaper.init(context);
        return ListView(
          children: <Widget>[
            _swiperWidget(),
            SizedBox(height: ScreenAdaper.height(20)),
            _titleWidget("猜你喜欢"),
            _hotProductListWidget(),
            SizedBox(height: ScreenAdaper.height(20)),
            _titleWidget("热门推荐"),
            _recProductListWidget()
          ],
        );
      }
    }

    ScreenAdaper.dart

    import 'package:flutter_screenutil/flutter_screenutil.dart';
    
    class ScreenAdaper {
      //
      static init(context) {
        ScreenUtil.instance = ScreenUtil( 750, height: 1334)..init(context);
      }
    
      static height(double value) {
        return ScreenUtil.getInstance().setHeight(value);
      }
    
      static width(double value) {
        return ScreenUtil.getInstance().setWidth(value);
      }
    
      static getScreenHeight() {
        return ScreenUtil.screenHeightDp;
      }
    
      static getScreenWidth() {
        return ScreenUtil.screenWidthDp;
      }
    
      static size(double size) { //适配字体
        return ScreenUtil.getInstance().setSp(size);
      }
    }
    /*  */

    Search.dart

    import 'package:flutter/material.dart';
    import 'package:flutter_jdshop/services/ScreenAdaper.dart';
    class SearchPage extends StatefulWidget {
      SearchPage({Key key}) : super(key: key);
    
      _SearchPageState createState() => _SearchPageState();
    }
    
    class _SearchPageState extends State<SearchPage> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title:Container(
              child: TextField(
                autofocus: true,
                decoration: InputDecoration(
                  border: OutlineInputBorder(
                    borderRadius: BorderRadius.circular(30),
                    borderSide: BorderSide.none
                  )
                ),
              ),
              height: ScreenAdaper.height(68),
              decoration: BoxDecoration(
                color: Color.fromRGBO(233,233,233,0.8),
                borderRadius: BorderRadius.circular(30)
              ),
            ),
            actions: <Widget>[
              InkWell(
                child: Container(
                  height: ScreenAdaper.height(68),
                   ScreenAdaper.width(80),
                  child: Row(
                    children: <Widget>[
                      Text('搜索')
                    ],
                  ),
                ),
                onTap: (){
                  
                },
              )
            ],
          ),
          body: Text('搜索')
        );
      }
    }

  • 相关阅读:
    Ubuntu下ATI显卡风扇转速调节脚本
    App_GlobalResources和LocalResources文件夹区别
    ubuntu下添加开机启动项
    UBUNTU安装PHP
    ubuntu apache2配置
    在ubuntu 上安装半透明玻璃窗口
    ASP.NET 页面:在此页面动态调用用户控件(.ASCX)
    Ubuntu 安装 LAMP 主机之后运行出现乱码
    Ubuntu下安装LMAP—菜鸟版
    Ubuntu 10.04风扇声音太大
  • 原文地址:https://www.cnblogs.com/yiweiyihang/p/11421742.html
Copyright © 2020-2023  润新知