对接动态接口

master
laiiihz 5 years ago
parent 5a41c92d6c
commit 289a93793a

@ -417,4 +417,7 @@ class LiveAPI {
///
static const String videoList = '/v1/live/short/list';
///
static const String activityList = '/v1/live/user/trend/list';
}

@ -0,0 +1,127 @@
class ActivityListModel {
String content;
Goods goods;
int id;
List<ImgList> imgList;
int originId;
int trendType;
String updatedAt;
Short short;
ActivityListModel(
{this.content,
this.goods,
this.id,
this.imgList,
this.originId,
this.trendType,
this.updatedAt,
this.short});
ActivityListModel.fromJson(Map<String, dynamic> json) {
content = json['content'];
goods = json['goods'] != null ? new Goods.fromJson(json['goods']) : null;
id = json['id'];
if (json['imgList'] != null) {
imgList = new List<ImgList>();
json['imgList'].forEach((v) {
imgList.add(new ImgList.fromJson(v));
});
}
originId = json['originId'];
trendType = json['trendType'];
updatedAt = json['updatedAt'];
short = json['short'] != null ? new Short.fromJson(json['short']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['content'] = this.content;
if (this.goods != null) {
data['goods'] = this.goods.toJson();
}
data['id'] = this.id;
if (this.imgList != null) {
data['imgList'] = this.imgList.map((v) => v.toJson()).toList();
}
data['originId'] = this.originId;
data['trendType'] = this.trendType;
data['updatedAt'] = this.updatedAt;
if (this.short != null) {
data['short'] = this.short.toJson();
}
return data;
}
}
class Goods {
int id;
String mainPhotoURL;
String name;
String price;
Goods({this.id, this.mainPhotoURL, this.name, this.price});
Goods.fromJson(Map<String, dynamic> json) {
id = json['id'];
mainPhotoURL = json['mainPhotoURL'];
name = json['name'];
price = json['price'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['mainPhotoURL'] = this.mainPhotoURL;
data['name'] = this.name;
data['price'] = this.price;
return data;
}
}
class ImgList {
num height;
int id;
int momentsCopyId;
String url;
num width;
ImgList({this.height, this.id, this.momentsCopyId, this.url, this.width});
ImgList.fromJson(Map<String, dynamic> json) {
height = json['height'];
id = json['id'];
momentsCopyId = json['momentsCopyId'];
url = json['url'];
width = json['width'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['height'] = this.height;
data['id'] = this.id;
data['momentsCopyId'] = this.momentsCopyId;
data['url'] = this.url;
data['width'] = this.width;
return data;
}
}
class Short {
String mediaUrl;
String coverUrl;
Short({this.mediaUrl, this.coverUrl});
Short.fromJson(Map<String, dynamic> json) {
mediaUrl = json['media_url'];
coverUrl = json['cover_url'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['media_url'] = this.mediaUrl;
data['cover_url'] = this.coverUrl;
return data;
}
}

@ -0,0 +1,60 @@
import 'package:flutter/material.dart';
import 'package:recook/constants/api.dart';
import 'package:recook/manager/http_manager.dart';
import 'package:recook/pages/live/models/activity_list_model.dart';
import 'package:recook/pages/live/widget/user_activity_card.dart';
import 'package:recook/widgets/refresh_widget.dart';
class UserActivityView extends StatefulWidget {
final int id;
UserActivityView({Key key, @required this.id}) : super(key: key);
@override
_UserActivityViewState createState() => _UserActivityViewState();
}
class _UserActivityViewState extends State<UserActivityView>
with AutomaticKeepAliveClientMixin {
List<ActivityListModel> activityListModels = [];
int _page = 1;
GSRefreshController _controller = GSRefreshController();
@override
Widget build(BuildContext context) {
super.build(context);
return RefreshWidget(
controller: _controller,
onRefresh: () {
getActivityModels().then((models) {
_page = 1;
setState(() {
activityListModels = models;
});
_controller.refreshCompleted();
});
},
body: ListView.builder(
itemBuilder: (context, index) {
return UserActivityCard(model: activityListModels[index]);
},
itemCount: activityListModels.length,
),
);
}
Future<List> getActivityModels() async {
ResultData resultData = await HttpManager.post(LiveAPI.activityList, {
'userId': widget.id,
'page': _page,
'limit': 10,
});
if (resultData?.data['data']['list'] == null)
return [];
else
return (resultData?.data['data']['list'] as List)
.map((e) => ActivityListModel.fromJson(e))
.toList();
}
@override
bool get wantKeepAlive => true;
}

@ -8,6 +8,7 @@ import 'package:recook/manager/user_manager.dart';
import 'package:recook/pages/live/models/live_base_info_model.dart';
import 'package:recook/pages/live/sub_page/live_host_center_page.dart';
import 'package:recook/pages/live/sub_page/user_attention_page.dart';
import 'package:recook/pages/live/sub_page/user_home/user_activity_view.dart';
import 'package:recook/pages/live/widget/live_attention_button.dart';
import 'package:recook/pages/live/widget/sliver_bottom_persistent_delegate.dart';
import 'package:recook/pages/live/widget/user_activity_card.dart';
@ -196,9 +197,7 @@ class _UserHomePageState extends State<UserHomePage>
child: TabBarView(
controller: _tabController,
children: [
ListView.builder(itemBuilder: (context, index) {
return UserActivityCard();
}),
UserActivityView(id: widget.userId),
ListView.builder(itemBuilder: (context, index) {
return UserPlaybackCard();
})

@ -1,45 +1,71 @@
import 'package:flutter/material.dart';
import 'package:recook/constants/api.dart';
import 'package:recook/constants/constants.dart';
import 'package:recook/constants/header.dart';
import 'package:recook/pages/live/models/activity_list_model.dart';
import 'package:recook/pages/live/widget/user_base_card.dart';
import 'package:recook/utils/date/recook_date_util.dart';
import 'package:recook/widgets/custom_image_button.dart';
class UserActivityCard extends StatefulWidget {
UserActivityCard({Key key}) : super(key: key);
final ActivityListModel model;
UserActivityCard({Key key, @required this.model}) : super(key: key);
@override
_UserActivityCardState createState() => _UserActivityCardState();
}
class _UserActivityCardState extends State<UserActivityCard> {
int get imgSize => widget.model.imgList.length;
int get axisCount {
if (imgSize == 1)
return 1;
else if (imgSize <= 4)
return 2;
else
return 3;
}
@override
Widget build(BuildContext context) {
final recookDateUtil = RecookDateUtil.fromString(widget.model.updatedAt);
return UserBaseCard(
date: '昨天',
detailDate: '14:30',
date: recookDateUtil.prefixDay,
detailDate: recookDateUtil.detailDate,
children: [
SizedBox(height: rSize(35)),
GridView(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
crossAxisSpacing: rSize(9),
mainAxisSpacing: rSize(9),
),
physics: NeverScrollableScrollPhysics(),
children: [
Image.asset(R.ASSETS_PLACEHOLDER_NEW_1X1_A_PNG),
Image.asset(R.ASSETS_PLACEHOLDER_NEW_1X1_A_PNG),
Image.asset(R.ASSETS_PLACEHOLDER_NEW_1X1_A_PNG),
],
shrinkWrap: true,
),
Builder(builder: (context) {
if (widget.model.trendType == 1)
return widget.model.imgList.isEmpty
? SizedBox()
: GridView(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: axisCount,
crossAxisSpacing: rSize(9),
mainAxisSpacing: rSize(9),
),
physics: NeverScrollableScrollPhysics(),
children: widget.model.imgList
.map((e) => FadeInImage.assetNetwork(
placeholder: R.ASSETS_PLACEHOLDER_NEW_1X1_A_PNG,
image: Api.getImgUrl(e.url),
))
.toList(),
shrinkWrap: true,
);
else if (widget.model.trendType == 2)
return Image.asset(R.ASSETS_PLACEHOLDER_NEW_1X1_A_PNG);
else
return SizedBox();
}),
Padding(
padding: EdgeInsets.symmetric(
vertical: rSize(10),
),
child: Text(
'''麦饭石不粘锅炒锅具家用平底电磁炉适用燃煤气灶专用炒菜锅
2030030''',
widget.model.content,
style: TextStyle(
color: Color(0xFF333333),
fontSize: rSP(14),
@ -51,8 +77,9 @@ class _UserActivityCardState extends State<UserActivityCard> {
padding: EdgeInsets.all(12),
child: Row(
children: [
Image.asset(
R.ASSETS_PLACEHOLDER_NEW_1X1_A_PNG,
FadeInImage.assetNetwork(
placeholder: R.ASSETS_PLACEHOLDER_NEW_1X1_A_PNG,
image: Api.getImgUrl(widget.model.goods.mainPhotoURL),
height: rSize(48),
width: rSize(48),
),
@ -62,7 +89,7 @@ class _UserActivityCardState extends State<UserActivityCard> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'左家右厨16cm迷煎盘',
widget.model.goods.name,
maxLines: 1,
style: TextStyle(
color: Color(0xFF333333),
@ -71,7 +98,7 @@ class _UserActivityCardState extends State<UserActivityCard> {
),
SizedBox(height: rSize(6)),
Text(
'¥199',
'¥${widget.model.goods.price}',
maxLines: 1,
style: TextStyle(
color: Color(0xFF333333),

@ -148,11 +148,11 @@ class _TabBarWidgetState extends State<TabBarWidget>
onTap: () => CRoute.push(
context, AddVideoPage()),
),
verticalButton(
'图文',
R.ASSETS_LIVE_ADD_IMAGE_PNG,
onTap: () {},
),
// verticalButton(
// '图文',
// R.ASSETS_LIVE_ADD_IMAGE_PNG,
// onTap: () {},
// ),
],
),
CustomImageButton(

@ -0,0 +1,40 @@
import 'package:common_utils/common_utils.dart';
class RecookDateUtil {
DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(0);
///
RecookDateUtil.fromString(String rawData) {
dateTime = DateUtil.getDateTime(rawData);
}
///
RecookDateUtil(this.dateTime);
String get prefixDay {
if (isToday)
return '今天';
else if (isYesterday)
return '昨天';
else
return DateUtil.formatDate(dateTime, format: 'M/d');
}
String get detailDate => DateUtil.formatDate(dateTime, format: 'HH:mm');
///
bool get isToday {
DateTime now = DateTime.now();
return now.month == dateTime.month &&
now.year == dateTime.year &&
now.day == dateTime.day;
}
///
bool get isYesterday {
DateTime now = DateTime.now();
return now.month == dateTime.month &&
now.year == dateTime.year &&
now.day == (dateTime.day + 1);
}
}
Loading…
Cancel
Save