logo头像
Snippet 博客主题

仿京东商城03

一、Wrap的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/热门商品
Widget _hotGoods() {
var itemWidth = (ScreenAdaper.screenWidth() - 30) / 2;

return Container(
padding: EdgeInsets.all(10),
child: Wrap(
runSpacing: 10,
spacing: 10,
children: this._bestProductList.map((value) {
//图片
String sPic = value.pic;
sPic = Config.baseUrl + sPic.replaceAll('\\', '/');

return InkWell(
onTap: () {
Navigator.pushNamed(context, '/productContent',
arguments: {"id": value.id});
},
child: Container(
padding: EdgeInsets.all(10),
width: itemWidth,
decoration: BoxDecoration(
border: Border.all(
color: Color.fromRGBO(233, 233, 233, 0.9), width: 1)),
child: Column(
children: <Widget>[
Container(
width: double.infinity,
child: AspectRatio(
//防止服务器返回的图片大小不一致导致高度不一致问题
aspectRatio: 1 / 1,
child: Image.network(
"${sPic}",
fit: BoxFit.cover,
),
),
),
Padding(
padding: EdgeInsets.only(top: ScreenAdaper.height(20)),
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.price}",
style: TextStyle(
color: Colors.black54,
fontSize: 14,
decoration: TextDecoration.lineThrough)),
)
],
),
)
],
),
),
);
}).toList(),
),
);
}

二、GridView的使用

看名字就可以理解
SliverGridDelegateWithFixedCrossAxisCount 固定个数
SliverGridDelegateWithMaxCrossAxisExtent 不固定个数
跟iOS中UICollectionView差不多

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Widget rightCateWidget() {
final itemWidth = (ScreenAdaper.screenWidth() - 30) / 3;

if (this._productRightList.length > 0) {
return Container(
height: double.infinity,
color: Color.fromRGBO(240, 240, 240, 1),
child: GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
mainAxisSpacing: 10,
crossAxisSpacing: 10,
childAspectRatio: itemWidth / (itemWidth + 40),
),
itemBuilder: (context, index) {
String pic = this._productRightList[index].pic;
pic = Config.baseUrl + pic.replaceAll("\\", "/");
return Container(
color: Color.fromRGBO(180, 180, 180, 1),
child: Column(
children: [
AspectRatio(
aspectRatio: 1 / 1,
child: Image.network(
"${pic}",
fit: BoxFit.cover,
)),
Center(
heightFactor: 1.5,
child: Text("${this._productRightList[index].title}"))
],
));
},
itemCount: this._productRightList.length,
),
);
} else {
return Text("暂无数据");
}
}

三、IndexedStack保持页面状态

IndexedStack和Stack一样,都是层布局控件,可以在一个控件上面放置另一个控件,但唯一不同的是IndexedStack在同一时刻只能显示子控件中的一个控件,通过Index属性来设置显示的控件。IndexedStack来保持页面状态的优点就是配置简单。IndexedStack保持页面状态的缺点就是不方便单独控制每个页面的状态。

四、AutomaticKeepAliveClientMixin保持页面状态

AutomaticKeepAliveClientMixin结合tab切换保持页面状态相比IndexedStack而言配置起来稍微有些复杂。它结合底部BottomNavigationBar保持页面状态的时候需要进行如下配置。

  • 初始化PageController

  • 结合PageView 跳转

  • 再需要保持状态的页面继承AutomaticKeepAliveClientMixin

  • 重新方法返回true即可

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    class Tabs extends StatefulWidget {
    @override
    _TabsState createState() => _TabsState();
    }

    class _TabsState extends State<Tabs> {
    int _currentIndex = 0;
    List <Widget>_pageList = [HomePage(), CategoryPage(),CartPage(),UsersPage()];
    PageController _pageController;
    @override
    void initState() {
    //初始化页面
    _pageController = PageController(initialPage: _currentIndex);
    super.initState();
    }
    @override
    Widget build(BuildContext context) {
    return Scaffold(
    appBar: AppBar(
    title: Text("仿京东商城"),
    ),
    body: PageView(
    controller: _pageController,
    children: this._pageList,
    onPageChanged: (index){
    print(index);
    },
    ),
    bottomNavigationBar: BottomNavigationBar(
    currentIndex: this._currentIndex,
    onTap: (index) {
    setState(() {
    this._currentIndex = index;
    this._pageController.jumpToPage(index);
    });
    },
    type: BottomNavigationBarType.fixed,
    fixedColor: Colors.red,
    items: [
    BottomNavigationBarItem(
    icon: Icon(Icons.home),
    label: "首页",
    ),
    BottomNavigationBarItem(
    icon: Icon(Icons.category),
    label: "分类",
    ),
    BottomNavigationBarItem(
    icon: Icon(Icons.shopping_cart),
    label: "消息",
    ),
    BottomNavigationBarItem(
    icon: Icon(Icons.person),
    label: "我的",
    ),
    ]),
    );
    }
    }

    禁止PageView滑动

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    body: PageView(
    physics: new NeverScrollableScrollPhysics(),//禁止滑动
    controller: _pageController,
    children: this._pageList,
    onPageChanged: (index){
    print(index);
    setState(() {
    this._currentIndex = index;

    });
微信打赏

赞赏是不耍流氓的鼓励