Flutter實戰視頻-移動電商-44.詳細頁_首屏自定義Widget編寫

44.詳細頁_首屏自定義Widget編寫

把詳細頁的圖片、標題、編號和價格造成一個單獨的widget去引用html

詳情頁的頂部單獨封裝個插件

 

在pages下面新建detials_page的文件件並在裏面新建頁面details_top_area.dart文件app

添加引用,而後聲明一個靜態的類less

返回頂部圖片的方法

 

商品名稱方法:

商品編號方法

 

開始寫Build

 

最外層是一個Provide,裏面model類傳遞的是商品詳情的類jsp

 

在主頁內引用子組件

首先引入咱們寫的組件的頁面文件,而後調用咱們寫的組件的類就能夠了。async

DetailsTopAreaide

 

效果展現

點擊首頁的輪播圖就看到詳情的頁面了。函數

 

最終代碼:

import 'package:flutter/material.dart';
import 'package:provide/provide.dart';
import '../provide/details_info.dart';
import './details_page/details_top_area.dart';

class DetailsPage extends StatelessWidget {
  final String goodsId;

  DetailsPage(this.goodsId);//flutter 1.2的最新的寫法 構造函數

  @override
  Widget build(BuildContext context) {
 
    return Scaffold(
      appBar: AppBar(
        leading: IconButton(
          icon: Icon(Icons.arrow_back),
          onPressed: (){
            Navigator.pop(context);//返回上一個頁面
          },
        ),
        title: Text('商品詳細頁'),
      ),
      body: FutureBuilder(
        future: _getBackInfo(context),
        builder: (context,snapshot){
          //判斷是否有數據
          if(snapshot.hasData){
            //若是有數據返回一個Container
            return Container(
              child: Column(
                children: <Widget>[
                  DetailsTopArea(),
                ],
              ),
            );
          }else{
            return Text('加載中......');//沒有數據的狀況
          }
        },
      ),
    );
  }

  Future _getBackInfo(BuildContext context) async{
    await Provide.value<DetailsInfoProvide>(context).getGoodsInfo(goodsId);
    //print('加載完成...........');
    return '完成加載';
  }

}

 

 

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


class DetailsTopArea extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Provide<DetailsInfoProvide>(
      builder: (context,child,val){
        var goodsInfo=Provide.value<DetailsInfoProvide>(context).goodsInfo.data.goodInfo;
        if(goodsInfo!=null){
          return Container(
            color: Colors.white,
            child: Column(
              children: <Widget>[
                _goodsImage(goodsInfo.image1),
                _goodsName(goodsInfo.goodsName),
                _goodsNum(goodsInfo.goodsSerialNumber)
              ],
            ),
          );
        }else{
          return Text('正在記載中');
        }
      },
    );
  }
  //商品圖片
  Widget _goodsImage(url){
    return Image.network(
      url,
      width:ScreenUtil().setWidth(740),
    );
  }
  //商品名稱
  Widget _goodsName(name){
    return Container(
      width:ScreenUtil().setWidth(740),
      padding: EdgeInsets.only(left:15.0),//左側的邊距
      child: Text(
        name,//傳過來的標題
        style:TextStyle(
          fontSize: ScreenUtil().setSp(30)//設置字體的大小
        )
      ),
    );
  }
  //商品編號
  Widget _goodsNum(num){
    return Container(
      width: ScreenUtil().setWidth(730),
      padding: EdgeInsets.only(left:5.0),
      margin: EdgeInsets.only(top: 8.0),
      child: Text(
        '編號:${num}',
        style: TextStyle(
          color: Colors.black12,
        ),
      ),
    );
  }

}

 

價格的Widget

參考博客上的代碼:post

https://jspang.com/posts/2019/03/01/flutter-shop.html#%E7%AC%AC44%E8%8A%82%EF%BC%9A%E8%AF%A6%E7%BB%86%E9%A1%B5-%E9%A6%96%E5%B1%8F%E8%87%AA%E5%AE%9A%E4%B9%89widget%E7%BC%96%E5%86%99字體

 

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


class DetailsTopArea extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Provide<DetailsInfoProvide>(
      builder: (context,child,val){
        var goodsInfo=Provide.value<DetailsInfoProvide>(context).goodsInfo.data.goodInfo;
        if(goodsInfo!=null){
          return Container(
            color: Colors.white,
            child: Column(
              children: <Widget>[
                _goodsImage(goodsInfo.image1),
                _goodsName(goodsInfo.goodsName),
                _goodsNum(goodsInfo.goodsSerialNumber),
                _goodsPrice(goodsInfo.presentPrice,goodsInfo.oriPrice),
              ],
            ),
          );
        }else{
          return Text('正在記載中');
        }
      },
    );
  }
  //商品圖片
  Widget _goodsImage(url){
    return Image.network(
      url,
      width:ScreenUtil().setWidth(740),
    );
  }
  //商品名稱
  Widget _goodsName(name){
    return Container(
      width:ScreenUtil().setWidth(740),
      padding: EdgeInsets.only(left:15.0),//左側的邊距
      child: Text(
        name,//傳過來的標題
        style:TextStyle(
          fontSize: ScreenUtil().setSp(30)//設置字體的大小
        )
      ),
    );
  }
  //商品編號
  Widget _goodsNum(num){
    return Container(
      width: ScreenUtil().setWidth(730),
      padding: EdgeInsets.only(left:5.0),
      margin: EdgeInsets.only(top: 8.0),
      child: Text(
        '編號:${num}',
        style: TextStyle(
          color: Colors.black12,
        ),
      ),
    );
  }
  //商品價格
  Widget _goodsPrice(presentPrice,oriPrice){
    return Container(
      width: ScreenUtil().setWidth(730),
      padding: EdgeInsets.only(left:15.0),
      margin: EdgeInsets.only(top:8.0),
      child: Row(
        children: <Widget>[
          Text(
            '¥${presentPrice}',
            style:TextStyle(
              color: Colors.pinkAccent,
              fontSize: ScreenUtil().setSp(40),
            )
          ),
          Text(
            '市場價:¥${oriPrice}',
            style: TextStyle(
              color: Colors.black26,
              decoration: TextDecoration.lineThrough
            ),
          )
        ],
      ),
    );
  }
  
}
details_top_area.dart

 

效果展現:ui

相關文章
相關標籤/搜索