@@ -0,0 +1,24 @@ | |||||
import 'package:flutter/material.dart'; | |||||
class HotRankingPage extends StatefulWidget { | |||||
@override | |||||
_HotRankingPageState createState() => _HotRankingPageState(); | |||||
} | |||||
class _HotRankingPageState extends State<HotRankingPage> { | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
print('hot_ranking_page build'); | |||||
// | |||||
// List<Widget> contentWidgets = tabs.map((item) { | |||||
// BaseTabModel model = BaseTabModel.fromJson(item); | |||||
// return PageFactory.create(model.skipIdentifier, item); | |||||
// }).toList(); | |||||
// if (_currentIndex >= contentWidgets.length) { | |||||
// _currentIndex = 0; | |||||
// } | |||||
return Scaffold(); | |||||
} | |||||
} |
@@ -0,0 +1,44 @@ | |||||
import 'dart:async'; | |||||
import 'package:zhiying_comm/util/base_bloc.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
class HotRankingPage extends BlocBase { | |||||
List<Map<String, dynamic>> _pageData = List(); | |||||
StreamController<List<Map<String, dynamic>>> _dataController = | |||||
StreamController<List<Map<String, dynamic>>>(); | |||||
Stream<List<Map<String, dynamic>>> get outData => _dataController.stream; | |||||
@override | |||||
void dispose() { | |||||
_dataController.close(); | |||||
_dataController = null; | |||||
} | |||||
void loadData(int id) { | |||||
NetUtil.request('/api/v1/mod', | |||||
method: NetMethod.POST, | |||||
params: Map<String, dynamic>.from({ | |||||
'ids': [id] | |||||
}), onCache: (data) { | |||||
_loadData(id, data); | |||||
}, onSuccess: (data) { | |||||
_loadData(id, data); | |||||
}); | |||||
} | |||||
void _loadData(int id, dynamic data) { | |||||
String key = id.toString(); | |||||
Map<String, dynamic> json = Map<String, dynamic>.from(data); | |||||
if (json.containsKey(key)) { | |||||
List<dynamic> list = json[key]; | |||||
_pageData = list.map((item) { | |||||
return Map<String, dynamic>.from(item); | |||||
}).toList(); | |||||
} | |||||
_dataController.add(_pageData); | |||||
} | |||||
} |
@@ -0,0 +1,44 @@ | |||||
import 'dart:async'; | |||||
import 'package:zhiying_comm/util/base_bloc.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
class HotRankingBloc extends BlocBase { | |||||
List<Map<String, dynamic>> _pageData = List(); | |||||
StreamController<List<Map<String, dynamic>>> _dataController = | |||||
StreamController<List<Map<String, dynamic>>>(); | |||||
Stream<List<Map<String, dynamic>>> get outData => _dataController.stream; | |||||
@override | |||||
void dispose() { | |||||
_dataController.close(); | |||||
_dataController = null; | |||||
} | |||||
void loadData(int id) { | |||||
NetUtil.request('/api/v1/mod', | |||||
method: NetMethod.POST, | |||||
params: Map<String, dynamic>.from({ | |||||
'ids': [id] | |||||
}), onCache: (data) { | |||||
_loadData(id, data); | |||||
}, onSuccess: (data) { | |||||
_loadData(id, data); | |||||
}); | |||||
} | |||||
void _loadData(int id, dynamic data) { | |||||
String key = id.toString(); | |||||
Map<String, dynamic> json = Map<String, dynamic>.from(data); | |||||
if (json.containsKey(key)) { | |||||
List<dynamic> list = json[key]; | |||||
_pageData = list.map((item) { | |||||
return Map<String, dynamic>.from(item); | |||||
}).toList(); | |||||
} | |||||
_dataController.add(_pageData); | |||||
} | |||||
} |
@@ -0,0 +1,91 @@ | |||||
import 'package:flutter/material.dart'; | |||||
import 'package:zhiying_base_widget/widgets/hot_ranking/hot_ranking_bloc.dart'; | |||||
import 'package:zhiying_base_widget/widgets/hot_ranking/hot_ranking_goods/hot_ranking_goods.dart'; | |||||
import 'package:zhiying_base_widget/widgets/hot_ranking/hot_ranking_sk.dart'; | |||||
class HotRankingContainer extends StatefulWidget { | |||||
final Map<String, dynamic> data; | |||||
const HotRankingContainer({Key key, this.data}) : super(key: key); | |||||
@override | |||||
_HotRankingState createState() => _HotRankingState(); | |||||
} | |||||
class _HotRankingState extends State<HotRankingContainer> | |||||
with TickerProviderStateMixin { | |||||
HotRankingBloc _bloc; | |||||
TabController _tabController; | |||||
@override | |||||
void initState() { | |||||
_bloc = HotRankingBloc(); | |||||
super.initState(); | |||||
} | |||||
_buildTabs() { | |||||
List<Widget> listWidget = List(); | |||||
for (int index = 0; index < 4; index++) { | |||||
listWidget.add(Tab( | |||||
text: "hahah", | |||||
)); | |||||
} | |||||
return listWidget; | |||||
} | |||||
@override | |||||
void dispose() { | |||||
_tabController.dispose(); | |||||
super.dispose(); | |||||
} | |||||
///构建 | |||||
void createTabController() { | |||||
_tabController = TabController(length: 4, vsync: this); | |||||
} | |||||
///构建TabView | |||||
_buildTabView() { | |||||
List<Widget> listWidget = List(); | |||||
for (var index = 0; index < 4; index++) { | |||||
listWidget.add(ListView.builder( | |||||
padding: EdgeInsets.all(0), | |||||
itemCount: 10, | |||||
itemBuilder: (context, index) { | |||||
return Container( | |||||
child: HotRankingGoods(), | |||||
); | |||||
})); | |||||
} | |||||
return listWidget; | |||||
} | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return StreamBuilder( | |||||
stream: _bloc.outData, | |||||
builder: (context, snapshot) { | |||||
if (snapshot.data != null) { | |||||
return HotRankingSkeleton(); | |||||
} else { | |||||
createTabController(); | |||||
return Container( | |||||
child: Column( | |||||
children: <Widget>[ | |||||
TabBar( | |||||
controller: _tabController, | |||||
isScrollable: true, | |||||
tabs: _buildTabs(), | |||||
), | |||||
Expanded( | |||||
child: TabBarView( | |||||
controller: _tabController, | |||||
children: _buildTabView())) | |||||
], | |||||
), | |||||
); | |||||
} | |||||
}); | |||||
} | |||||
} |
@@ -0,0 +1,218 @@ | |||||
import 'package:flutter/material.dart'; | |||||
import 'package:flutter_screenutil/flutter_screenutil.dart'; | |||||
import 'package:zhiying_base_widget/widgets/home/home_quick_entry/cached_network_image_util.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
import 'package:cached_network_image/cached_network_image.dart'; | |||||
class HotRankingGoods extends StatelessWidget { | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return Stack( | |||||
children: <Widget>[ | |||||
Container( | |||||
padding: EdgeInsets.all(15.w), | |||||
margin: | |||||
EdgeInsets.only(top: 8.w, bottom: 8.w, left: 25.w, right: 25.w), | |||||
decoration: BoxDecoration( | |||||
color: Colors.white, borderRadius: BorderRadius.circular(15.w)), | |||||
child: Row( | |||||
crossAxisAlignment: CrossAxisAlignment.start, | |||||
children: <Widget>[ | |||||
Container( | |||||
width: 254.w, | |||||
height: 254.w, | |||||
color: Colors.amber, | |||||
), | |||||
Expanded( | |||||
child: Container( | |||||
margin: EdgeInsets.only(left: 20.w), | |||||
child: Column( | |||||
mainAxisSize: MainAxisSize.max, | |||||
children: <Widget>[ | |||||
Container( | |||||
height: 70.h, | |||||
child: Row( | |||||
children: <Widget>[ | |||||
Expanded( | |||||
child: RichText( | |||||
overflow: TextOverflow.ellipsis, | |||||
maxLines: 2, | |||||
text: TextSpan(children: <InlineSpan>[ | |||||
WidgetSpan( | |||||
child: Container( | |||||
decoration: BoxDecoration( | |||||
color: Colors.red, | |||||
borderRadius: | |||||
BorderRadius.circular(4)), | |||||
child: Padding( | |||||
padding: EdgeInsets.only( | |||||
left: 4.w, right: 4.w), | |||||
child: Text( | |||||
"京东", | |||||
style: TextStyle( | |||||
color: HexColor.fromHex( | |||||
"#FFFFFF", | |||||
), | |||||
fontSize: 18.sp), | |||||
), | |||||
), | |||||
)), | |||||
WidgetSpan( | |||||
child: SizedBox( | |||||
width: 4.h, | |||||
)), | |||||
TextSpan( | |||||
text: | |||||
"Segway Ninebot mini Pro九号平衡车智能代步...", | |||||
style: TextStyle( | |||||
color: Colors.black, | |||||
fontSize: 30.sp)) | |||||
]))) | |||||
], | |||||
), | |||||
), | |||||
Row( | |||||
children: <Widget>[ | |||||
Container( | |||||
margin: EdgeInsets.only(top: 4, bottom: 4), | |||||
decoration: BoxDecoration(color: Colors.red), | |||||
child: Padding( | |||||
padding: const EdgeInsets.only( | |||||
left: 8, right: 8, top: 2, bottom: 2), | |||||
child: Text( | |||||
"50元券", | |||||
style: TextStyle( | |||||
color: Colors.white, fontSize: 22.sp), | |||||
), | |||||
), | |||||
), | |||||
SizedBox( | |||||
width: 10.sp, | |||||
), | |||||
Container( | |||||
margin: EdgeInsets.only(top: 4, bottom: 4), | |||||
decoration: BoxDecoration(color: Colors.red), | |||||
child: Padding( | |||||
padding: const EdgeInsets.only( | |||||
left: 8, right: 8, top: 2, bottom: 2), | |||||
child: Text( | |||||
"50元券", | |||||
style: TextStyle( | |||||
color: Colors.white, fontSize: 22.sp), | |||||
), | |||||
), | |||||
) | |||||
], | |||||
), | |||||
Padding( | |||||
padding: const EdgeInsets.only(top: 4, bottom: 4), | |||||
child: Row( | |||||
crossAxisAlignment: CrossAxisAlignment.end, | |||||
children: <Widget>[ | |||||
Padding( | |||||
padding: EdgeInsets.only(bottom: 6.sp), | |||||
child: Text( | |||||
"¥", | |||||
style: | |||||
TextStyle(color: Colors.red, fontSize: 20.sp), | |||||
), | |||||
), | |||||
Text( | |||||
"1409", | |||||
style: | |||||
TextStyle(color: Colors.red, fontSize: 40.sp), | |||||
), | |||||
SizedBox( | |||||
width: 6, | |||||
), | |||||
Padding( | |||||
padding: EdgeInsets.only(bottom: 4.sp), | |||||
child: Text( | |||||
"¥1409", | |||||
style: TextStyle( | |||||
color: Colors.red, | |||||
fontSize: 22.sp, | |||||
decoration: TextDecoration.lineThrough), | |||||
), | |||||
), | |||||
], | |||||
), | |||||
), | |||||
Row( | |||||
children: <Widget>[ | |||||
Expanded( | |||||
child: Stack( | |||||
alignment: Alignment.centerLeft, | |||||
children: <Widget>[ | |||||
Row( | |||||
children: <Widget>[ | |||||
Expanded( | |||||
child: Container( | |||||
height: 40.w, | |||||
padding: EdgeInsets.only( | |||||
left: 64.w, | |||||
), | |||||
margin: EdgeInsets.only(right: 20), | |||||
color: Colors.red, | |||||
child: Text( | |||||
"热销1231.1万件", | |||||
style: TextStyle( | |||||
color: Colors.white, fontSize: 22.sp), | |||||
), | |||||
)) | |||||
], | |||||
), | |||||
Container( | |||||
color: Colors.amber, | |||||
width: 48.w, | |||||
height: 48.w, | |||||
child: CachedNetworkImage( | |||||
imageUrl: "", | |||||
width: 48.w, | |||||
height: 48.w, | |||||
placeholder: (context, _) => | |||||
Container(color: Colors.yellow), | |||||
fit: BoxFit.fill, | |||||
), | |||||
), | |||||
Align( | |||||
alignment: Alignment.centerRight, | |||||
child: Container( | |||||
decoration: BoxDecoration( | |||||
color: Colors.amber, | |||||
borderRadius: BorderRadius.circular(20)), | |||||
margin: EdgeInsets.only(right: 0), | |||||
child: Padding( | |||||
padding: EdgeInsets.only( | |||||
left: 16, right: 16, top: 4, bottom: 4), | |||||
child: Text( | |||||
"马上抢", | |||||
style: TextStyle( | |||||
color: Colors.white, fontSize: 26.sp), | |||||
), | |||||
), | |||||
), | |||||
) | |||||
], | |||||
)) | |||||
], | |||||
) | |||||
], | |||||
), | |||||
)) | |||||
], | |||||
), | |||||
), | |||||
Align( | |||||
alignment: Alignment.topLeft, | |||||
child: Container( | |||||
margin: EdgeInsets.only(left: 40.w, top: 8.h), | |||||
color: Colors.red, | |||||
height: 60.w, | |||||
width: 60.w, | |||||
), | |||||
) | |||||
], | |||||
); | |||||
} | |||||
} |
@@ -0,0 +1,8 @@ | |||||
class HotRankingModel{ | |||||
ResHotRankingModel resHotRankingModel; | |||||
} | |||||
class ResHotRankingModel{ | |||||
} |
@@ -0,0 +1,85 @@ | |||||
import 'package:flutter/material.dart'; | |||||
import 'package:shimmer/shimmer.dart'; | |||||
class HotRankingSkeleton extends StatelessWidget { | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return Shimmer.fromColors( | |||||
baseColor: Colors.grey[300], | |||||
highlightColor: Colors.grey[100], | |||||
child: Column( | |||||
children: <Widget>[ | |||||
Container( | |||||
width: double.infinity, | |||||
margin: EdgeInsets.all(16), | |||||
height: 48, | |||||
child: Row( | |||||
children: _buildTopRow(), | |||||
)), | |||||
Expanded( | |||||
child: Container( | |||||
child: Column( | |||||
children: _buildBottomListItem(), | |||||
), | |||||
)) | |||||
], | |||||
), | |||||
); | |||||
} | |||||
_buildBottomListItem() { | |||||
List<Widget> listWidget = List(); | |||||
for (var index = 0; index < 3; index++) { | |||||
listWidget.add(Container( | |||||
margin: EdgeInsets.only(left: 16,top: 10,bottom: 10), | |||||
child: Row( | |||||
children: <Widget>[ | |||||
Container( | |||||
width: 127, | |||||
height: 127, | |||||
color: Colors.white, | |||||
), | |||||
Container( | |||||
height: 127, | |||||
margin: EdgeInsets.only(left: 10), | |||||
child: Column( | |||||
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |||||
crossAxisAlignment: CrossAxisAlignment.start, | |||||
children: <Widget>[ | |||||
Container( | |||||
height: 40, | |||||
width: 200, | |||||
color: Colors.white, | |||||
), | |||||
Container( | |||||
height: 30, | |||||
width: 100, | |||||
color: Colors.grey, | |||||
), | |||||
Container( | |||||
height: 30, | |||||
width: 200, | |||||
color: Colors.grey, | |||||
) | |||||
], | |||||
), | |||||
) | |||||
], | |||||
), | |||||
)); | |||||
} | |||||
return listWidget; | |||||
} | |||||
_buildTopRow() { | |||||
List<Widget> listWidget = List(); | |||||
for (var index = 0; index < 5; index++) { | |||||
listWidget.add(Container( | |||||
width: 50, | |||||
color: Colors.white, | |||||
margin: EdgeInsets.all(10), | |||||
)); | |||||
} | |||||
return listWidget; | |||||
} | |||||
} |
@@ -0,0 +1,20 @@ | |||||
import 'package:flutter/material.dart'; | |||||
import 'package:zhiying_base_widget/widgets/hot_ranking/hot_ranking_container.dart'; | |||||
import 'package:zhiying_base_widget/widgets/hot_ranking/hot_ranking_sk.dart'; | |||||
import 'package:flutter_screenutil/flutter_screenutil.dart'; | |||||
class HotTest extends StatefulWidget { | |||||
@override | |||||
_HotTestState createState() => _HotTestState(); | |||||
} | |||||
class _HotTestState extends State<HotTest> { | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
// 屏幕适配初始化 | |||||
ScreenUtil.init(context, width: 750, height: 1334); | |||||
return Scaffold( | |||||
body: HotRankingContainer(), | |||||
); | |||||
} | |||||
} |