Weller 4 роки тому
джерело
коміт
ab421fdfc2
23 змінених файлів з 1479 додано та 253 видалено
  1. +8
    -1
      lib/pages/main_page/main_page.dart
  2. +1
    -1
      lib/pages/search_result_page/item/search_result_item_page.dart
  3. +21
    -0
      lib/pages/team_details_page/bloc/team_details_bloc.dart
  4. +5
    -0
      lib/pages/team_details_page/bloc/team_details_event.dart
  5. +4
    -0
      lib/pages/team_details_page/bloc/team_details_repository.dart
  6. +10
    -0
      lib/pages/team_details_page/bloc/team_details_state.dart
  7. +36
    -0
      lib/pages/team_details_page/team_details_page.dart
  8. +25
    -0
      lib/pages/team_page/bloc/team_bloc.dart
  9. +5
    -0
      lib/pages/team_page/bloc/team_event.dart
  10. +4
    -0
      lib/pages/team_page/bloc/team_repository.dart
  11. +10
    -0
      lib/pages/team_page/bloc/team_state.dart
  12. +249
    -0
      lib/pages/team_page/team_page.dart
  13. +49
    -47
      lib/pages/test_page/test_page.dart
  14. +4
    -0
      lib/register.dart
  15. +1
    -1
      lib/widgets/home/home_goods/home_goods_header.dart
  16. +104
    -40
      lib/widgets/home/home_goods/home_goods_item.dart
  17. +125
    -46
      lib/widgets/home/home_goods/home_goods_item_single.dart
  18. +423
    -39
      lib/widgets/home/home_goods/models/home_goods_style_model.dart
  19. +7
    -5
      lib/widgets/search/input/search_input_widget.dart
  20. +24
    -12
      lib/widgets/team/data/team_data_widet.dart
  21. +65
    -0
      lib/widgets/team/details/team_details_month_data_widget.dart
  22. +180
    -7
      lib/widgets/team/fans/team_fans_item.dart
  23. +119
    -54
      lib/widgets/team/recommend/team_recommend_widget.dart

+ 8
- 1
lib/pages/main_page/main_page.dart Переглянути файл

@@ -67,6 +67,11 @@ class _MainPageContainerState extends State<_MainPageContainer>
// _refreshController.loadComplete();
}

void _onRefresh() async{
await Duration(microseconds: 3);
_refreshController.refreshCompleted();
}

@override
void didChangeAppLifecycleState(AppLifecycleState state) async {
///智能粘贴板
@@ -77,6 +82,7 @@ class _MainPageContainerState extends State<_MainPageContainer>
@override
void dispose() {
_controller.dispose();
_refreshController.dispose();
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@@ -123,10 +129,11 @@ class _MainPageContainerState extends State<_MainPageContainer>
context: context,
child: SmartRefresher(
enablePullDown: true,
enablePullUp: false,
enablePullUp: true,
header: WaterDropHeader(),
controller: _refreshController,
onLoading: _onLoading,
onRefresh: _onRefresh,
child: Container(
width: double.infinity,
child: Stack(


+ 1
- 1
lib/pages/search_result_page/item/search_result_item_page.dart Переглянути файл

@@ -140,7 +140,7 @@ class _SearchResultItemPageContianerState extends State<SearchResultItemPageCont
enablePullDown: true,
enablePullUp: true,
// footer: ClassicFooter(),
// header: WaterDropHeader(),
// header: MaterialClassicHeader(),
controller: _refreshController,
child: CustomScrollView(
controller: _controller,


+ 21
- 0
lib/pages/team_details_page/bloc/team_details_bloc.dart Переглянути файл

@@ -0,0 +1,21 @@
import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';

part 'team_details_event.dart';
part 'team_details_state.dart';

class TeamDetailsBloc extends Bloc<TeamDetailsEvent, TeamDetailsState> {
// TeamDetailsBloc() : super(TeamDetailsInitial());

@override
Stream<TeamDetailsState> mapEventToState(
TeamDetailsEvent event,
) async* {

}

@override
TeamDetailsState get initialState => TeamDetailsInitial();
}

+ 5
- 0
lib/pages/team_details_page/bloc/team_details_event.dart Переглянути файл

@@ -0,0 +1,5 @@
part of 'team_details_bloc.dart';

abstract class TeamDetailsEvent extends Equatable {
const TeamDetailsEvent();
}

+ 4
- 0
lib/pages/team_details_page/bloc/team_details_repository.dart Переглянути файл

@@ -0,0 +1,4 @@

class TeamDetailsRepository{

}

+ 10
- 0
lib/pages/team_details_page/bloc/team_details_state.dart Переглянути файл

@@ -0,0 +1,10 @@
part of 'team_details_bloc.dart';

abstract class TeamDetailsState extends Equatable {
const TeamDetailsState();
}

class TeamDetailsInitial extends TeamDetailsState {
@override
List<Object> get props => [];
}

+ 36
- 0
lib/pages/team_details_page/team_details_page.dart Переглянути файл

@@ -0,0 +1,36 @@

import 'package:flutter/material.dart';
import 'package:zhiying_comm/zhiying_comm.dart'
'';

///
/// 我的团队 - 用户详情
///
class TeamDetailsPage extends StatefulWidget {
@override
_TeamDetailsPageState createState() => _TeamDetailsPageState();
}

class _TeamDetailsPageState extends State<TeamDetailsPage> {
@override
Widget build(BuildContext context) {
return _getMainWidget();
}


/// 主视图
Widget _getMainWidget(){
return Scaffold(
backgroundColor: HexColor.fromHex('#F9F9F9'),
body: Container(),
);
}

/// 推荐人


/// 推荐人的信息

/// 本月数据 & 上个月数据

}

+ 25
- 0
lib/pages/team_page/bloc/team_bloc.dart Переглянути файл

@@ -0,0 +1,25 @@
import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';

part 'team_event.dart';
part 'team_state.dart';

class TeamBloc extends Bloc<TeamEvent, TeamState> {
// TeamBloc() : super(TeamInitial());

@override
TeamState get initialState => TeamInitial();

@override
Stream<TeamState> mapEventToState(
TeamEvent event,
) async* {



}


}

+ 5
- 0
lib/pages/team_page/bloc/team_event.dart Переглянути файл

@@ -0,0 +1,5 @@
part of 'team_bloc.dart';

abstract class TeamEvent extends Equatable {
const TeamEvent();
}

+ 4
- 0
lib/pages/team_page/bloc/team_repository.dart Переглянути файл

@@ -0,0 +1,4 @@

class TeamRepository{

}

+ 10
- 0
lib/pages/team_page/bloc/team_state.dart Переглянути файл

@@ -0,0 +1,10 @@
part of 'team_bloc.dart';

abstract class TeamState extends Equatable {
const TeamState();
}

class TeamInitial extends TeamState {
@override
List<Object> get props => [];
}

+ 249
- 0
lib/pages/team_page/team_page.dart Переглянути файл

@@ -0,0 +1,249 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:tab_indicator_styler/tab_indicator_styler.dart';
import 'package:zhiying_base_widget/widgets/team/data/team_data_widet.dart';
import 'package:zhiying_base_widget/widgets/team/recommend/team_recommend_widget.dart';
import 'package:zhiying_comm/util/custom_sliver_persistent_header_delegate.dart';
import 'package:zhiying_comm/zhiying_comm.dart';
import 'dart:ui';

///
/// 我的团队
///
class TeamPage extends StatefulWidget {
@override
_TeamPageState createState() => _TeamPageState();
}

class _TeamPageState extends State<TeamPage> {
@override
Widget build(BuildContext context) {
return _getMainWidget();
}

var tabTitle = [
'全部会员',
'青铜会员',
'白银会员',
'黄金会员',
];
TabController _controller;

@override
void initState() {
_controller = TabController(length: tabTitle.length, vsync: ScrollableState());
super.initState();
}

@override
void dispose() {
_controller?.dispose();
super.dispose();
}

/// 主体视图
Widget _getMainWidget() {
return Scaffold(
backgroundColor: HexColor.fromHex('#F9F9F9'),
body: NestedScrollView(
headerSliverBuilder: (context, bool) {
return [
/// 头部Bar
SliverAppBar(
// expandedHeight: 200.0,
leading: IconButton(
icon: Icon(
Icons.arrow_back_ios,
size: 22,
color: HexColor.fromHex('#333333'),
),
onPressed: () => Navigator.maybePop(context),
),
backgroundColor: Colors.white,
floating: true,
pinned: true,
title: Text(
'我的团队',
style: TextStyle(color: HexColor.fromHex('#333333'), fontWeight: FontWeight.bold, fontSize: 18),
),
centerTitle: true,
elevation: 0,
),

/// 我的推荐人
SliverToBoxAdapter(
child: TeamRecommendWidget(),
),

/// 数据
SliverToBoxAdapter(
child: TeamDataWidget(),
),

SliverToBoxAdapter(child: SizedBox(height: 8)),

/// 输入框
SliverPersistentHeader(
delegate: CustomSliverPersistentHeaderDelegate(
min: 34,
max: 34,
child: Container(
width: double.infinity,
height: double.infinity,
padding: const EdgeInsets.only(top: 10, left: 12.5, right: 12.5),
color: Colors.white,
child: Row(
children: <Widget>[
/// 输入框
Expanded(
child: Container(
height: 24,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(30),
color: HexColor.fromHex('#F7F7F7'),
),
padding: const EdgeInsets.only(top: 5, bottom: 4.5, left: 7.5, right: 7.5),
width: double.infinity,
child: Row(
children: <Widget>[
Container(width: 11.5, height: 11.5, color: Colors.red,),
Expanded(child: Container(
color: Colors.transparent,
child: TextField(
style: TextStyle(fontSize: 11 , color: HexColor.fromHex('#000000'), textBaseline: TextBaseline.alphabetic),
decoration: InputDecoration(
focusedBorder: InputBorder.none,
border: InputBorder.none,
focusedErrorBorder: InputBorder.none,
errorBorder: InputBorder.none,
disabledBorder: InputBorder.none,
enabledBorder: InputBorder.none,
filled: true,
isDense: true,
contentPadding: const EdgeInsets.only(left: 6, bottom: 0, top: 0, right: 0),
fillColor: Colors.transparent,
hintStyle: TextStyle(fontSize: 11 , color: HexColor.fromHex('#999999'), textBaseline: TextBaseline.alphabetic),
hintText: '输入需搜索的手机号/昵称',
),
),
),),
Container(width: 15, height: 15, color: Colors.red,)
],
),
),
),
const SizedBox(width: 8),
/// 确定按钮
Container(
decoration: BoxDecoration(borderRadius: BorderRadius.circular(30), color: HexColor.fromHex('#FF4242')),
padding: const EdgeInsets.only(left: 15, right: 15, bottom: 6.5, top: 6.5),
child: Text('搜索', style: TextStyle(color: HexColor.fromHex('#FFFFFF'), fontSize: 11),),
)
],
),
),
),
pinned: true,
),

/// 悬停TabBar
SliverPersistentHeader(
delegate: new _SliverTabBarDelegate(
TabBar(
isScrollable: false,
labelStyle: TextStyle(fontWeight: FontWeight.bold, fontSize: 13),
unselectedLabelStyle: TextStyle(fontSize: 13),
indicator: MaterialIndicator(
height: 2,
topLeftRadius: 8,
topRightRadius: 8,
bottomLeftRadius: 8,
bottomRightRadius: 8,
color: HexColor.fromHex('#F94B47'),
horizontalPadding: 30,
),
controller: _controller,
tabs: tabTitle.map((f) => Tab(text: f)).toList(),
indicatorColor: Colors.red,
unselectedLabelColor: HexColor.fromHex('#999999'),
labelColor: HexColor.fromHex('#000000'),
),
),
pinned: true,
),

/// 筛选条件
SliverPersistentHeader(
delegate: CustomSliverPersistentHeaderDelegate(
max: 32.5,
min: 32.5,
child: Container(
height: double.infinity,
width: double.infinity,
color: HexColor.fromHex('#FFFFFF'),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[

Text('邀请人数', style: TextStyle(fontSize: 12, color: HexColor.fromHex('#999999')),),
Text('邀请人数', style: TextStyle(fontSize: 12, color: HexColor.fromHex('#999999')),),
Text('邀请人数', style: TextStyle(fontSize: 12, color: HexColor.fromHex('#999999')),),
Text('邀请人数', style: TextStyle(fontSize: 12, color: HexColor.fromHex('#999999')),),

],
),
)),
pinned: true,
),
];
},
body: MediaQuery.removePadding(
removeTop: true,
context: context,
child: TabBarView(
controller: _controller,
children: tabTitle
.map((s) => ListView.builder(
itemBuilder: (context, int) => Text("123"),
itemCount: 100,
))
.toList(),
),
),
),
);
}
}

class _SliverTabBarDelegate extends SliverPersistentHeaderDelegate {
final TabBar widget;

const _SliverTabBarDelegate(this.widget) : assert(widget != null);

@override
Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) {
return Container(
color: Colors.white,
child: Row(
children: <Widget>[
const SizedBox(width: 30),
Expanded(
child: this.widget,
),
const SizedBox(width: 30),
],
),
);
}

@override
bool shouldRebuild(_SliverTabBarDelegate oldDelegate) {
return false;
}

@override
double get maxExtent => widget.preferredSize.height;

@override
double get minExtent => widget.preferredSize.height;
}

+ 49
- 47
lib/pages/test_page/test_page.dart Переглянути файл

@@ -15,28 +15,28 @@ class _TestPageState extends State<TestPage> {

@override
void initState() {
NetUtil.request('/api/v1/rec/featured?page=3', method: NetMethod.GET,
onSuccess: (data) {
List goods = data['good'];
_styleModel = HomeGoodsStyleModel(
listColumn: '1',
// recommendList,
providerNameColor: '#ffffff',
providerNameBackgroundColor: '#ff4242',
shopNameColor: '#ffffff',
shopIcon: '',
couponFontColor: '#ffffff',
couponBgColor: '#ff4242',
commissionFontColor: '#ffffff',
commissionBgColor: '#ff4242',
marketPriceColor: '#ffffff',
currentPriceColor: '#ff4242',
);
_goods = goods.map((e) {
return HomeGoodsModel.fromJson(Map<String, dynamic>.from(e));
}).toList();
setState(() {});
});
// NetUtil.request('/api/v1/rec/featured?page=3', method: NetMethod.GET,
// onSuccess: (data) {
// List goods = data['good'];
// _styleModel = HomeGoodsStyleModel(
// listColumn: '1',
// // recommendList,
// providerNameColor: '#ffffff',
// providerNameBackgroundColor: '#ff4242',
// shopNameColor: '#ffffff',
// shopIcon: '',
// couponFontColor: '#ffffff',
// couponBgColor: '#ff4242',
// commissionFontColor: '#ffffff',
// commissionBgColor: '#ff4242',
// marketPriceColor: '#ffffff',
// currentPriceColor: '#ff4242',
// );
// _goods = goods.map((e) {
// return HomeGoodsModel.fromJson(Map<String, dynamic>.from(e));
// }).toList();
// setState(() {});
// });
super.initState();
}

@@ -46,30 +46,32 @@ class _TestPageState extends State<TestPage> {
appBar: AppBar(
title: Text('测试'),
),
body: CustomScrollView(
slivers: <Widget>[
SliverFixedExtentList(
itemExtent: 200.0,
delegate: new SliverChildBuilderDelegate(
(BuildContext context, int index) {
//创建列表项
return HomeGoodsItemSingle(
_goods[index % _goods.length], _styleModel);
},
childCount: (_goods?.length ?? 0) * 2000, //50个列表项
),
),
// SliverToBoxAdapter(
// child: ListView.builder(
// shrinkWrap: true,
// physics: NeverScrollableScrollPhysics(),
// itemCount: (_goods?.length ?? 0) * 20,
// itemBuilder: (context, index) {
// return HomeGoodsItemSingle(
// _goods[index % _goods.length], _styleModel);
// }),
// )
],
));
body: Container(),
// body: CustomScrollView(
// slivers: <Widget>[
// SliverFixedExtentList(
// itemExtent: 200.0,
// delegate: new SliverChildBuilderDelegate(
// (BuildContext context, int index) {
// //创建列表项
// return HomeGoodsItemSingle(
// _goods[index % _goods.length], _styleModel);
// },
// childCount: (_goods?.length ?? 0) * 2000, //50个列表项
// ),
// ),
// // SliverToBoxAdapter(
// // child: ListView.builder(
// // shrinkWrap: true,
// // physics: NeverScrollableScrollPhysics(),
// // itemCount: (_goods?.length ?? 0) * 20,
// // itemBuilder: (context, index) {
// // return HomeGoodsItemSingle(
// // _goods[index % _goods.length], _styleModel);
// // }),
// // )
// ],
// ));
);
}
}

+ 4
- 0
lib/register.dart Переглянути файл

@@ -16,6 +16,7 @@ import 'package:zhiying_base_widget/pages/security_page/security_mobile/security
import 'package:zhiying_base_widget/pages/security_page/security_page.dart';
import 'package:zhiying_base_widget/pages/security_page/security_password/security_password.dart';
import 'package:zhiying_base_widget/pages/setting_page/setting_page.dart';
import 'package:zhiying_base_widget/pages/team_page/team_page.dart';
import 'package:zhiying_base_widget/pages/test_page/test_page.dart';
import 'package:zhiying_base_widget/pages/webview/base_webview.dart';
import 'package:zhiying_base_widget/widgets/goods_details/footer/goods_details_footer_widget.dart';
@@ -136,6 +137,9 @@ class BaseWidgetRegister {
PageFactory.regist(
'pub.flutter.invite_friends', (model) => InvitedFriendsPage(model));
PageFactory.regist('pub.flutter.fav', (model) => FavoritePage());

/// 我的团队
PageFactory.regist('team_page', (model) => TeamPage());
}

// 注册控件


+ 1
- 1
lib/widgets/home/home_goods/home_goods_header.dart Переглянути файл

@@ -77,7 +77,7 @@ class _HomeGoodsHeaderState extends State<_HomeGoodsHeader>
_style = HomeGoodsStyleModel.fromJson(Map<String, dynamic>.from(json));

_tabController =
TabController(length: _style.recommendList.length, vsync: this);
TabController(length: _style?.recommendList?.length?? 0, vsync: this);
if (_style.recommendList.first != null) {
widget.eventBus
.fire(HomeGoodsHeaderEvent(_style.recommendList.first.type));


+ 104
- 40
lib/widgets/home/home_goods/home_goods_item.dart Переглянути файл

@@ -14,8 +14,7 @@ class HomeGoodsItem extends StatelessWidget {
final HomeGoodsStyleModel style;
Map<String, dynamic> data;

HomeGoodsItem(this.goods, this.style, {Key key, this.data})
: super(key: key) {
HomeGoodsItem(this.goods, this.style, {Key key, this.data}) : super(key: key) {
if (this.data != null && this.data.containsKey('data')) {
String data = this.data['data'];
Map<String, dynamic> json = Map<String, dynamic>.from(jsonDecode(data));
@@ -34,10 +33,7 @@ class HomeGoodsItem extends StatelessWidget {
onTap: () => _onJumpGoodsDetails(context, goods),
child: Container(
margin: EdgeInsets.only(top: 4, bottom: 4, left: 5, right: 5),

decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(7.5))),
decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(7.5))),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
@@ -66,7 +62,6 @@ class HomeGoodsItem extends StatelessWidget {
_createShop(),
Expanded(child: Container()),
_createBottom(),

_createCupone(),
],
),
@@ -80,6 +75,18 @@ class HomeGoodsItem extends StatelessWidget {
Widget _createTitle() {
List<InlineSpan> list = List();
if (goods.providerName != null && goods.providerName != '') {
HomeGoodsStyleModelProviders providers;
int providersLength = style?.providers?.length ?? 0;
if(providersLength > 0) {
for (int i = 0; i < style.providers.length; i++) {
HomeGoodsStyleModelProviders item = style.providers[i];
if (goods.provider == item.type) {
providers = item;
break;
}
}
}

list.add(WidgetSpan(
child: Container(
padding: EdgeInsets.only(left: 2, right: 2, top: 3, bottom: 3),
@@ -89,21 +96,20 @@ class HomeGoodsItem extends StatelessWidget {
style: TextStyle(
fontSize: 9,
height: 1,
color: HexColor.fromHex(style.providerNameColor),
// color: HexColor.fromHex(style.providerNameColor),
color: HexColor.fromHex(providers?.providerNameColor),
),
),
decoration: BoxDecoration(
color: HexColor.fromHex(style.providerNameBackgroundColor),
// color: HexColor.fromHex(style.providerNameBackgroundColor),
color: HexColor.fromHex(providers?.providerBgColor),
borderRadius: BorderRadius.circular(2.5)),
),
));
}
list.add(TextSpan(
text: goods.goodTitle,
style: TextStyle(
fontSize: 15,
color: HexColor.fromHex('#333333'),
fontWeight: FontWeight.bold),
style: TextStyle(fontSize: 15, color: HexColor.fromHex('#333333'), fontWeight: FontWeight.bold),
));
return RichText(
maxLines: 2,
@@ -131,10 +137,7 @@ class HomeGoodsItem extends StatelessWidget {
child: Text(
goods.shopName,
maxLines: 1,
style: TextStyle(
color: HexColor.fromHex(style.shopNameColor),
fontSize: 11,
fontWeight: FontWeight.w400),
style: TextStyle(color: HexColor.fromHex(style.shopNameColor), fontSize: 11, fontWeight: FontWeight.w400),
))
],
),
@@ -144,42 +147,103 @@ class HomeGoodsItem extends StatelessWidget {
Widget _createCupone() {
List<Widget> widgets = List();
if (goods.coupon != null && goods.coupon != '') {
var couponDe = style?.couponCommission?.coupon?.isImg == '1'
? BoxDecoration(
image: DecorationImage(
image: CachedNetworkImageProvider(style?.couponCommission?.coupon?.couponBgImg ?? ''),
),
borderRadius: BorderRadius.circular(2.5),
)
: BoxDecoration(
color: HexColor.fromHex(style?.couponCommission?.coupon?.couponBgColor),
borderRadius: BorderRadius.circular(2.5),
);

widgets.add(Container(
margin: EdgeInsets.only(right: 5),
padding: EdgeInsets.only(left: 10, right: 10, top: 3, bottom: 3),
decoration: BoxDecoration(
color: HexColor.fromHex(style.couponBgColor),
borderRadius: BorderRadius.circular(2.5),
),
child: Text(
goods.coupon,
textAlign: TextAlign.center,
// decoration: BoxDecoration(
// color: HexColor.fromHex(style.couponBgColor),
// borderRadius: BorderRadius.circular(2.5),
// ),
// child: Text(
// goods.coupon,
// textAlign: TextAlign.center,
// maxLines: 1,
// style: TextStyle(
// height: 1,
// fontSize: 11,
// // color: HexColor.fromHex(style.couponFontColor),
// color: HexColor.fromHex(style?.couponCommission?.coupon?.couponFontColor),
// ),
// ),
decoration: couponDe,
child: RichText(
maxLines: 1,
style: TextStyle(
height: 1,
fontSize: 11,
color: HexColor.fromHex(style.couponFontColor),
),
textAlign: TextAlign.center,
text: TextSpan(
text: '${goods?.coupon ?? '0'}',
style: TextStyle(
height: 1,
fontSize: 11,
color: HexColor.fromHex(style?.couponCommission?.coupon?.couponFontColor),
),
children: [
TextSpan(
text: '${style?.couponCommission?.coupon?.couonText ?? '元劵'}',
style: TextStyle(
height: 1,
fontSize: 11,
color: HexColor.fromHex(style?.couponCommission?.coupon?.couponFontColor),
),
)
]),
),
));
}

if (goods.commission != null || goods.commission != '') {

var commissionDe = style?.couponCommission?.commission?.isImg == '1'
? BoxDecoration(
image: DecorationImage(
image: CachedNetworkImageProvider(style?.couponCommission?.commission?.commissionBgImg ?? ''),
),
borderRadius: BorderRadius.circular(2.5),
)
: BoxDecoration(
color: HexColor.fromHex(style?.couponCommission?.commission?.commissionBgColor),
borderRadius: BorderRadius.circular(2.5),
);

widgets.add(Container(
margin: EdgeInsets.only(right: 5),
padding: EdgeInsets.only(left: 10, right: 10, top: 3, bottom: 3),
decoration: BoxDecoration(
color: HexColor.fromHex(style.commissionBgColor),
borderRadius: BorderRadius.circular(2.5),
),
child: Text(
goods.commission,
textAlign: TextAlign.center,
// decoration: BoxDecoration(
// color: HexColor.fromHex(style.commissionBgColor),
// borderRadius: BorderRadius.circular(2.5),
// ),
decoration: commissionDe,
child: RichText(
maxLines: 1,
style: TextStyle(
height: 1,
fontSize: 11,
color: HexColor.fromHex(style.commissionFontColor),
textAlign: TextAlign.center,
text: TextSpan(
text: '${style?.couponCommission?.commission?.commissionText ?? ''}',
style: TextStyle(
height: 1,
fontSize: 11,
color: HexColor.fromHex(style?.couponCommission?.commission?.commissionFontColor),
),
children: [
TextSpan(
text: '${goods?.commission ?? '0'}',
style: TextStyle(
height: 1,
fontSize: 11,
color: HexColor.fromHex(style?.couponCommission?.commission?.commissionFontColor),
),
)
]
),
),
));


+ 125
- 46
lib/widgets/home/home_goods/home_goods_item_single.dart Переглянути файл

@@ -14,8 +14,7 @@ class HomeGoodsItemSingle extends StatelessWidget {
final HomeGoodsStyleModel style;
Map<String, dynamic> data;

HomeGoodsItemSingle(this.goods, this.style, {Key key, this.data})
: super(key: key) {
HomeGoodsItemSingle(this.goods, this.style, {Key key, this.data}) : super(key: key) {
if (this.data != null && this.data.containsKey('data')) {
String data = this.data['data'];
Map<String, dynamic> json = Map<String, dynamic>.from(jsonDecode(data));
@@ -35,9 +34,7 @@ class HomeGoodsItemSingle extends StatelessWidget {
child: Container(
margin: EdgeInsets.only(left: 12.5, right: 12.5, top: 4, bottom: 4),
padding: EdgeInsets.all(7.5),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(7.5))),
decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(7.5))),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
@@ -81,6 +78,18 @@ class HomeGoodsItemSingle extends StatelessWidget {
Widget _createTitle() {
List<InlineSpan> list = List();
if (goods.providerName != null && goods.providerName != '') {
HomeGoodsStyleModelProviders providers;
int providersLength = style?.providers?.length ?? 0;
if (providersLength > 0) {
for (int i = 0; i < style?.providers?.length ?? 0; i++) {
HomeGoodsStyleModelProviders item = style.providers[i];
if (goods.provider == item.type) {
providers = item;
break;
}
}
}

list.add(WidgetSpan(
child: Container(
padding: EdgeInsets.only(left: 2, right: 2, top: 3, bottom: 3),
@@ -90,21 +99,20 @@ class HomeGoodsItemSingle extends StatelessWidget {
style: TextStyle(
fontSize: 9,
height: 1,
color: HexColor.fromHex(style.providerNameColor),
// color: HexColor.fromHex(style.providerNameColor),
color: HexColor.fromHex(providers?.providerNameColor),
),
),
decoration: BoxDecoration(
color: HexColor.fromHex(style.providerNameBackgroundColor),
// color: HexColor.fromHex(style.providerNameBackgroundColor),
color: HexColor.fromHex(providers?.providerBgColor),
borderRadius: BorderRadius.circular(2.5)),
),
));
}
list.add(TextSpan(
text: goods.goodTitle,
style: TextStyle(
fontSize: 15,
color: HexColor.fromHex('#333333'),
fontWeight: FontWeight.bold),
style: TextStyle(fontSize: 15, color: HexColor.fromHex('#333333'), fontWeight: FontWeight.bold),
));
return RichText(
maxLines: 2,
@@ -130,13 +138,10 @@ class HomeGoodsItemSingle extends StatelessWidget {
),
Expanded(
child: Text(
goods.shopName,
maxLines: 1,
style: TextStyle(
color: HexColor.fromHex(style.shopNameColor),
fontSize: 11,
fontWeight: FontWeight.w400),
))
goods.shopName,
maxLines: 1,
style: TextStyle(color: HexColor.fromHex(style.shopNameColor), fontSize: 11, fontWeight: FontWeight.w400),
))
],
),
);
@@ -145,45 +150,119 @@ class HomeGoodsItemSingle extends StatelessWidget {
Widget _createCupone() {
List<Widget> widgets = List();
if (goods.coupon != null && goods.coupon != '') {
var couponDe = style?.couponCommission?.coupon?.isImg == '1'
? BoxDecoration(
image: DecorationImage(
image: CachedNetworkImageProvider(style?.couponCommission?.coupon?.couponBgImg ?? ''),
),
borderRadius: BorderRadius.circular(2.5),
)
: BoxDecoration(
color: HexColor.fromHex(style?.couponCommission?.coupon?.couponBgColor),
borderRadius: BorderRadius.circular(2.5),
);

widgets.add(Container(
margin: EdgeInsets.only(right: 5),
padding: EdgeInsets.only(left: 10, right: 10, top: 3, bottom: 3),
decoration: BoxDecoration(
color: HexColor.fromHex(style.couponBgColor),
borderRadius: BorderRadius.circular(2.5),
),
child: Text(
goods.coupon,
textAlign: TextAlign.center,
// decoration: BoxDecoration(
// color: HexColor.fromHex(style.couponBgColor),
// borderRadius: BorderRadius.circular(2.5),
// ),

// child: Text(
// goods.coupon,
// textAlign: TextAlign.center,
// maxLines: 1,
// style: TextStyle(
// height: 1,
// fontSize: 11,
// // color: HexColor.fromHex(style.couponFontColor),
// color: HexColor.fromHex(style?.couponCommission?.coupon?.couponFontColor),
// ),
// ),
decoration: couponDe,
child: RichText(
maxLines: 1,
style: TextStyle(
height: 1,
fontSize: 11,
color: HexColor.fromHex(style.couponFontColor),
),
textAlign: TextAlign.center,
text: TextSpan(
text: '${goods?.coupon ?? '0'}',
style: TextStyle(
height: 1,
fontSize: 11,
color: HexColor.fromHex(style?.couponCommission?.coupon?.couponFontColor),
),
children: [
TextSpan(
text: '${style?.couponCommission?.coupon?.couonText ?? '元劵'}',
style: TextStyle(
height: 1,
fontSize: 11,
color: HexColor.fromHex(style?.couponCommission?.coupon?.couponFontColor),
),
)
]),
),
));
}

if (goods.commission != null || goods.commission != '') {
widgets.add(Container(
margin: EdgeInsets.only(right: 5),
padding: EdgeInsets.only(left: 10, right: 10, top: 3, bottom: 3),
decoration: BoxDecoration(
color: HexColor.fromHex(style.commissionBgColor),
borderRadius: BorderRadius.circular(2.5),
),
child: Text(
goods.commission,
textAlign: TextAlign.center,
maxLines: 1,
style: TextStyle(
height: 1,
fontSize: 11,
color: HexColor.fromHex(style.commissionFontColor),
var commissionDe = style?.couponCommission?.commission?.isImg == '1'
? BoxDecoration(
image: DecorationImage(
image: CachedNetworkImageProvider(style?.couponCommission?.commission?.commissionBgImg ?? ''),
),
borderRadius: BorderRadius.circular(2.5),
)
: BoxDecoration(
color: HexColor.fromHex(style?.couponCommission?.commission?.commissionBgColor),
borderRadius: BorderRadius.circular(2.5),
);

widgets.add(
Container(
margin: EdgeInsets.only(right: 5),
padding: EdgeInsets.only(left: 10, right: 10, top: 3, bottom: 3),
// decoration: BoxDecoration(
// color: HexColor.fromHex(style.commissionBgColor),
// borderRadius: BorderRadius.circular(2.5),
// ),
// child: Text(
// goods.commission,
// textAlign: TextAlign.center,
// maxLines: 1,
// style: TextStyle(
// height: 1,
// fontSize: 11,
// // color: HexColor.fromHex(style.commissionFontColor),
// color: HexColor.fromHex(style?.couponCommission?.commission?.commissionFontColor),
// ),
// ),
decoration: commissionDe,
child: RichText(
maxLines: 1,
textAlign: TextAlign.center,
text: TextSpan(
text: '${style?.couponCommission?.commission?.commissionText ?? ''}',
style: TextStyle(
height: 1,
fontSize: 11,
color: HexColor.fromHex(style?.couponCommission?.commission?.commissionFontColor),
),
children: [
TextSpan(
text: '${goods?.commission ?? '0'}',
style: TextStyle(
height: 1,
fontSize: 11,
color: HexColor.fromHex(style?.couponCommission?.commission?.commissionFontColor),
),
)
]
),
),
),
));
);
}

return Container(


+ 423
- 39
lib/widgets/home/home_goods/models/home_goods_style_model.dart Переглянути файл

@@ -1,69 +1,453 @@
import 'package:zhiying_base_widget/widgets/home/home_goods/models/home_goods_header_model.dart';

class HomeGoodsStyleModel {
String listColumn;
List<HomeGoodsHeaderModel> recommendList;
String providerNameColor;
String providerNameBackgroundColor;
List<String> hotRankIconList;
String topMargin;
String leftRighMargin;
List<HomeGoodsStyleModelProviders> providers;
String titleColor;
String currentPriceColor;
String marketPriceColor;
String shopNameColor;
String saleCountColor;
String saleCountText;
String shopIcon;
String couponFontColor;
String couponBgColor;
String commissionFontColor;
String commissionBgColor;
String marketPriceColor;
String currentPriceColor;
HomeGoodsStyleModelCouponCommission couponCommission;
HomeGoodsStyleModelHotRank hotRank;

HomeGoodsStyleModel(
{this.listColumn,
this.recommendList,
this.providerNameColor,
this.providerNameBackgroundColor,
this.shopNameColor,
this.shopIcon,
this.couponFontColor,
this.couponBgColor,
this.commissionFontColor,
this.commissionBgColor,
this.marketPriceColor,
this.currentPriceColor});
HomeGoodsStyleModel({
this.listColumn,
this.recommendList,
this.hotRankIconList,
this.topMargin,
this.leftRighMargin,
this.providers,
this.titleColor,
this.currentPriceColor,
this.marketPriceColor,
this.shopNameColor,
this.saleCountColor,
this.saleCountText,
this.shopIcon,
this.couponCommission,
this.hotRank,
});

HomeGoodsStyleModel.fromJson(Map<String, dynamic> json) {
listColumn = json['list_column'];
listColumn = json['list_column']?.toString();
if (json['recommend_list'] != null) {
recommendList = new List<HomeGoodsHeaderModel>();
json['recommend_list'].forEach((v) {
recommendList.add(new HomeGoodsHeaderModel.fromJson(v));
});
}
providerNameColor = json['provider_name_color'];
providerNameBackgroundColor = json['provider_name_background_color'];
shopNameColor = json['shop_name_color'];
shopIcon = json['shop_icon'];
couponFontColor = json['coupon_font_color'];
couponBgColor = json['coupon_bg_color'];
commissionFontColor = json['commission_font_color'];
commissionBgColor = json['commission_bg_color'];
marketPriceColor = json['market_price_color'];
currentPriceColor = json['current_price_color'];
if(json['hot_rank_icon_list'] != null) {
hotRankIconList = json['hot_rank_icon_list'].cast<String>();
}
topMargin = json['top_margin']?.toString();
leftRighMargin = json['left_righ_margin']?.toString();
if (json['providers'] != null) {
providers = new List<HomeGoodsStyleModelProviders>();
json['providers'].forEach((v) {
providers.add(new HomeGoodsStyleModelProviders.fromJson(v));
});
}
titleColor = json['title_color']?.toString();
currentPriceColor = json['current_price_color']?.toString();
marketPriceColor = json['market_price_color']?.toString();
shopNameColor = json['shop_name_color']?.toString();
saleCountColor = json['sale_count_color']?.toString();
saleCountText = json['sale_count_text']?.toString();
shopIcon = json['shop_icon']?.toString();
couponCommission = json['coupon_commission'] != null ? new HomeGoodsStyleModelCouponCommission.fromJson(json['coupon_commission']) : null;
hotRank = json['hot_rank'] != null ? new HomeGoodsStyleModelHotRank.fromJson(json['hot_rank']) : null;
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['list_column'] = this.listColumn;
if (this.recommendList != null) {
data['recommend_list'] =
this.recommendList.map((v) => v.toJson()).toList();
data['recommend_list'] = this.recommendList.map((v) => v.toJson()).toList();
}
data['provider_name_color'] = this.providerNameColor;
data['provider_name_background_color'] = this.providerNameBackgroundColor;
data['hot_rank_icon_list'] = this.hotRankIconList;
data['top_margin'] = this.topMargin;
data['left_righ_margin'] = this.leftRighMargin;
if (this.providers != null) {
data['providers'] = this.providers.map((v) => v.toJson()).toList();
}
data['title_color'] = this.titleColor;
data['current_price_color'] = this.currentPriceColor;
data['market_price_color'] = this.marketPriceColor;
data['shop_name_color'] = this.shopNameColor;
data['sale_count_color'] = this.saleCountColor;
data['sale_count_text'] = this.saleCountText;
data['shop_icon'] = this.shopIcon;
if (this.couponCommission != null) {
data['coupon_commission'] = this.couponCommission.toJson();
}
if (this.hotRank != null) {
data['hot_rank'] = this.hotRank.toJson();
}
return data;
}
}

class HomeGoodsStyleModelProviders {
String type;
String providerNameColor;
String providerBgColor;

HomeGoodsStyleModelProviders({this.type, this.providerNameColor, this.providerBgColor});

HomeGoodsStyleModelProviders.fromJson(Map<String, dynamic> json) {
type = json['type']?.toString();
providerNameColor = json['provider_name_color']?.toString();
providerBgColor = json['provider_bg_color']?.toString();
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['type'] = this.type;
data['provider_name_color'] = this.providerNameColor;
data['provider_bg_color'] = this.providerBgColor;
return data;
}
}

class HomeGoodsStyleModelCouponCommission {
HomeGoodsStyleModelCoupon coupon;
HomeGoodsStyleModelCommission commission;

HomeGoodsStyleModelCouponCommission({this.coupon, this.commission});

HomeGoodsStyleModelCouponCommission.fromJson(Map<String, dynamic> json) {
coupon = json['left'] != null ? new HomeGoodsStyleModelCoupon.fromJson(json['left']) : null;
commission = json['right'] != null ? new HomeGoodsStyleModelCommission.fromJson(json['right']) : null;
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.coupon != null) {
data['left'] = this.coupon.toJson();
}
if (this.commission != null) {
data['right'] = this.commission.toJson();
}
return data;
}
}

class HomeGoodsStyleModelCoupon {
String couonText;
String couponFontColor;
String couponBgColor;
String couponBgImg;
String isImg;

HomeGoodsStyleModelCoupon({this.couonText, this.couponFontColor, this.couponBgColor, this.couponBgImg, this.isImg});

HomeGoodsStyleModelCoupon.fromJson(Map<String, dynamic> json) {
couonText = json['couon_text']?.toString();
couponFontColor = json['coupon_font_color']?.toString();
couponBgColor = json['coupon_bg_color']?.toString();
couponBgImg = json['coupon_bg_img']?.toString();
isImg = json['is_img']?.toString();
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['couon_text'] = this.couonText;
data['coupon_font_color'] = this.couponFontColor;
data['coupon_bg_color'] = this.couponBgColor;
data['coupon_bg_img'] = this.couponBgImg;
data['is_img'] = this.isImg;
return data;
}
}

class HomeGoodsStyleModelCommission {
String commissionText;
String commissionFontColor;
String commissionBgColor;
String commissionBgImg;
String isImg;

HomeGoodsStyleModelCommission({this.commissionText, this.commissionFontColor, this.commissionBgColor, this.commissionBgImg, this.isImg});

HomeGoodsStyleModelCommission.fromJson(Map<String, dynamic> json) {
commissionText = json['commission_text']?.toString();
commissionFontColor = json['commission_font_color']?.toString();
commissionBgColor = json['commission_bg_color']?.toString();
commissionBgImg = json['commission_bg_img']?.toString();
isImg = json['is_img']?.toString();
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['commission_text'] = this.commissionText;
data['commission_font_color'] = this.commissionFontColor;
data['commission_bg_color'] = this.commissionBgColor;
data['market_price_color'] = this.marketPriceColor;
data['current_price_color'] = this.currentPriceColor;
data['commission_bg_img'] = this.commissionBgImg;
data['is_img'] = this.isImg;
return data;
}
}

class HomeGoodsStyleModelHotRank {
String isOpen;
String bgColor;
String fontColor;
String hotSaleImg;
String buyNowImg;

HomeGoodsStyleModelHotRank({this.isOpen, this.bgColor, this.fontColor, this.hotSaleImg, this.buyNowImg});

HomeGoodsStyleModelHotRank.fromJson(Map<String, dynamic> json) {
isOpen = json['is_open']?.toString();
bgColor = json['bg_color']?.toString();
fontColor = json['font_color']?.toString();
hotSaleImg = json['hot_sale_img']?.toString();
buyNowImg = json['buy_now_img']?.toString();
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['is_open'] = this.isOpen;
data['bg_color'] = this.bgColor;
data['font_color'] = this.fontColor;
data['hot_sale_img'] = this.hotSaleImg;
data['buy_now_img'] = this.buyNowImg;
return data;
}
}
}

// class HomeGoodsStyleModel {
// String listColumn;
// List<HomeGoodsHeaderModel> recommendList;
// String providerNameColor;
// String providerNameBackgroundColor;
// String shopNameColor;
// String shopIcon;
// String couponFontColor;
// String couponBgColor;
// String commissionFontColor;
// String commissionBgColor;
// String marketPriceColor;
// String currentPriceColor;
//
// /// 2020-10-12日 新加
// String title_color;
// String sale_count_color;
// String sale_count_text;
// String top_margin;
// String left_righ_margin;
//
// HomeGoodsStyleModel({
// this.listColumn,
// this.recommendList,
// this.providerNameColor,
// this.providerNameBackgroundColor,
// this.shopNameColor,
// this.shopIcon,
// this.couponFontColor,
// this.couponBgColor,
// this.commissionFontColor,
// this.commissionBgColor,
// this.marketPriceColor,
// this.currentPriceColor,
// });
//
// HomeGoodsStyleModel.fromJson(Map<String, dynamic> json) {
// listColumn = json['list_column']?.toString();
// if (json['recommend_list'] != null) {
// recommendList = new List<HomeGoodsHeaderModel>();
// json['recommend_list'].forEach((v) {
// recommendList.add(new HomeGoodsHeaderModel.fromJson(v));
// });
// }
// providerNameColor = json['provider_name_color']?.toString();
// providerNameBackgroundColor = json['provider_name_background_color']?.toString();
// shopNameColor = json['shop_name_color']?.toString();
// shopIcon = json['shop_icon']?.toString();
// couponFontColor = json['coupon_font_color']?.toString();
// couponBgColor = json['coupon_bg_color']?.toString();
// commissionFontColor = json['commission_font_color']?.toString();
// commissionBgColor = json['commission_bg_color']?.toString();
// marketPriceColor = json['market_price_color']?.toString();
// currentPriceColor = json['current_price_color']?.toString();
// }
//
// Map<String, dynamic> toJson() {
// final Map<String, dynamic> data = new Map<String, dynamic>();
// data['list_column'] = this.listColumn;
// if (this.recommendList != null) {
// data['recommend_list'] = this.recommendList.map((v) => v.toJson()).toList();
// }
// data['provider_name_color'] = this.providerNameColor;
// data['provider_name_background_color'] = this.providerNameBackgroundColor;
// data['shop_name_color'] = this.shopNameColor;
// data['shop_icon'] = this.shopIcon;
// data['coupon_font_color'] = this.couponFontColor;
// data['coupon_bg_color'] = this.couponBgColor;
// data['commission_font_color'] = this.commissionFontColor;
// data['commission_bg_color'] = this.commissionBgColor;
// data['market_price_color'] = this.marketPriceColor;
// data['current_price_color'] = this.currentPriceColor;
// return data;
// }
// }
//
// class HomeGoodsStyleProvidersModel {
// String type;
// String provider_name_color;
// String provider_bg_color;
//
// HomeGoodsStyleProvidersModel({
// this.type,
// this.provider_name_color,
// this.provider_bg_color,
// });
//
// factory HomeGoodsStyleProvidersModel.fromJson(Map<String, dynamic> json) {
// return HomeGoodsStyleProvidersModel(
// type: json['type']?.toString(),
// provider_name_color: json['provider_name_color']?.toString(),
// provider_bg_color: json['provider_bg_color']?.toString(),
// );
// }
//
// Map<String, dynamic> toJson() {
// final Map<String, dynamic> data = new Map<String, dynamic>();
// data['type'] = this.type;
// data['provider_name_color'] = this.provider_name_color;
// data['provider_bg_color'] = this.provider_bg_color;
// return data;
// }
// }
//
// class HomeGoodsStyleCouponCommissionModel {
// HomeGoodsStyleCouonModel couonModel;
// HomeGoodsStyleCommissionModel commissionModel;
//
// HomeGoodsStyleCouponCommissionModel({
// this.couonModel,
// this.commissionModel,
// });
//
// factory HomeGoodsStyleCouponCommissionModel.fromJson(Map<String, dynamic> json) {
// return HomeGoodsStyleCouponCommissionModel(
// couonModel: json.containsKey('left') ? HomeGoodsStyleCouonModel.fromJson(json['left']) : null,
// commissionModel: json.containsKey('right') ? HomeGoodsStyleCommissionModel.fromJson(json['left']) : null,
// );
// }
// }
//
// class HomeGoodsStyleCouonModel {
// String couon_text;
// String coupon_font_color;
// String coupon_bg_color;
// String coupon_bg_img;
// String is_img;
//
// HomeGoodsStyleCouonModel({
// this.couon_text,
// this.coupon_font_color,
// this.coupon_bg_color,
// this.coupon_bg_img,
// this.is_img,
// });
//
// factory HomeGoodsStyleCouonModel.fromJson(Map<String, dynamic> json) {
// return HomeGoodsStyleCouonModel(
// couon_text: json['couon_text']?.toString(),
// coupon_font_color: json['coupon_font_color']?.toString(),
// coupon_bg_color: json['coupon_bg_color']?.toString(),
// coupon_bg_img: json['coupon_bg_img']?.toString(),
// is_img: json['is_img']?.toString(),
// );
// }
//
// Map<String, dynamic> toJson() {
// final Map<String, dynamic> data = new Map<String, dynamic>();
// data['couon_text'] = this.couon_text;
// data['coupon_font_color'] = this.coupon_font_color;
// data['coupon_bg_color'] = this.coupon_bg_color;
// data['coupon_bg_img'] = this.coupon_bg_img;
// data['is_img'] = this.is_img;
// return data;
// }
// }
//
// class HomeGoodsStyleCommissionModel {
// String commission_text;
// String commission_font_color;
// String commission_bg_color;
// String commission_bg_img;
// String is_img;
//
// HomeGoodsStyleCommissionModel({
// this.commission_text,
// this.commission_font_color,
// this.commission_bg_color,
// this.commission_bg_img,
// this.is_img,
// });
//
// factory HomeGoodsStyleCommissionModel.fromJson(Map<String, dynamic> json) {
// return HomeGoodsStyleCommissionModel(
// commission_text: json['commission_text']?.toString(),
// commission_font_color: json['commission_font_color']?.toString(),
// commission_bg_color: json['commission_bg_color']?.toString(),
// commission_bg_img: json['commission_bg_img']?.toString(),
// is_img: json['is_img']?.toString(),
// );
// }
//
// Map<String, dynamic> toJson() {
// final Map<String, dynamic> data = new Map<String, dynamic>();
// data['commission_text'] = this.commission_text;
// data['commission_font_color'] = this.commission_font_color;
// data['commission_bg_color'] = this.commission_bg_color;
// data['commission_bg_img'] = this.commission_bg_img;
// data['is_img'] = this.is_img;
// return data;
// }
// }
//
// class HomeGoodsStyleHotRankModel {
// String is_open;
// String bg_color;
// String font_color;
// String hot_sale_img;
// String buy_now_img;
//
// HomeGoodsStyleHotRankModel({
// this.is_open,
// this.bg_color,
// this.font_color,
// this.hot_sale_img,
// this.buy_now_img,
// });
//
// factory HomeGoodsStyleHotRankModel.fromJson(Map<String, dynamic> json) {
// return HomeGoodsStyleHotRankModel(
// is_open: json['is_open']?.toString(),
// bg_color: json['bg_color']?.toString(),
// font_color: json['font_color']?.toString(),
// hot_sale_img: json['hot_sale_img']?.toString(),
// buy_now_img: json['buy_now_img']?.toString(),
// );
// }
//
// Map<String, dynamic> toJson() {
// final Map<String, dynamic> data = new Map<String, dynamic>();
// data['is_open'] = this.is_open;
// data['bg_color'] = this.bg_color;
// data['font_color'] = this.font_color;
// data['hot_sale_img'] = this.hot_sale_img;
// data['buy_now_img'] = this.buy_now_img;
// return data;
// }
// }

+ 7
- 5
lib/widgets/search/input/search_input_widget.dart Переглянути файл

@@ -188,12 +188,14 @@ class _SearchInputWidgetState extends State<SearchInputWidget> {
controller: _editingController,
focusNode: _focusNode,
cursorColor: Colors.transparent,
style: TextStyle(fontSize: 14, color: HexColor.fromHex('#333333')),
style: TextStyle(fontSize: 14, color: HexColor.fromHex('#333333'), textBaseline: TextBaseline.alphabetic),
decoration: InputDecoration(
filled: false,
contentPadding: const EdgeInsets.only(left: 0, right: 0, bottom: 12, top: 0),
filled: true,
isDense: true,
contentPadding: EdgeInsets.zero,
// contentPadding: const EdgeInsets.only(left: 0, right: 0, bottom: 12, top: 0),
// focusColor: Colors.transparent,
// fillColor: Colors.transparent,
fillColor: Colors.transparent,
border: InputBorder.none,
focusedBorder: InputBorder.none,
focusedErrorBorder: InputBorder.none,
@@ -201,7 +203,7 @@ class _SearchInputWidgetState extends State<SearchInputWidget> {
disabledBorder: InputBorder.none,
enabledBorder: InputBorder.none,
hintText: model?.search_inpu_hint_text ?? '搜索更多优惠商品',
hintStyle: TextStyle(color: HexColor.fromHex('#999999'), fontSize: 14),
hintStyle: TextStyle(color: HexColor.fromHex('#999999'), fontSize: 14, textBaseline: TextBaseline.alphabetic),
),
),
);


+ 24
- 12
lib/widgets/team/data/team_data_widet.dart Переглянути файл

@@ -4,33 +4,37 @@ import 'package:zhiying_comm/zhiying_comm.dart';
///
/// 我的团队 - 数据widget
///
class TeamDataWidget extends StatefulWidget {
@override
_TeamDataWidgetState createState() => _TeamDataWidgetState();
}

class _TeamDataWidgetState extends State<TeamDataWidget> {
class TeamDataWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return _getMainWidget();
return Material(
child: _getMainWidget(),
);
}


/// 主视图
Widget _getMainWidget() {
return Container(
width: double.infinity,
margin: const EdgeInsets.only(left: 12.5, right: 12.5, top: 8),
padding: const EdgeInsets.only(left: 10.5, right: 9.5),
padding: const EdgeInsets.only(left: 10.5, right: 9.5, top: 8, bottom: 8),
decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: HexColor.fromHex('#FFFFFF')),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
/// 直推人数 & 间推人数
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
/// 直推人数
_getCustomWidget(text: '直推人数', textColor: '#999999', textSize: 12, number: '2258', numberColor: '#333333', numberSize: 30, icon: 'sss'),

/// 分割线
VerticalDivider(width: 40, thickness: 0.5, color: HexColor.fromHex('#F0F0F0')),
// VerticalDivider(width: 0.5, thickness: 40, color: HexColor.fromHex('#F0F0F0')),
SizedBox(height: 40, child: VerticalDivider(thickness: 0.5, color: HexColor.fromHex('#F0F0F0'), width: 0.5, )),

/// 间推人数
_getCustomWidget(text: '间推人数', textColor: '#999999', textSize: 12, number: '469', numberColor: '#333333', numberSize: 30, icon: 'sss'),
@@ -38,10 +42,11 @@ class _TeamDataWidgetState extends State<TeamDataWidget> {
),

/// 分割线
Divider(thickness: 0.5, height: double.infinity, color: HexColor.fromHex('#F0F0F0')),
Divider(thickness: 0.5, height: 20, color: HexColor.fromHex('#F0F0F0')),

/// 全部粉丝 & 今日新增 & 昨日新增
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
/// 全部粉丝
_getCustomWidget(
@@ -54,7 +59,8 @@ class _TeamDataWidgetState extends State<TeamDataWidget> {
),

/// 分割线
VerticalDivider(thickness: 0.5, width: 35, color: HexColor.fromHex('#F0F0F0')),
// VerticalDivider(thickness: 0.5, width: 1, color: HexColor.fromHex('#F0F0F0')),
SizedBox(height: 35, child: VerticalDivider(thickness: 0.5, color: HexColor.fromHex('#F0F0F0'), width: 0.5, )),

/// 今日新增
_getCustomWidget(
@@ -67,7 +73,8 @@ class _TeamDataWidgetState extends State<TeamDataWidget> {
),

/// 分割线
VerticalDivider(thickness: 0.5, width: 35, color: HexColor.fromHex('#F0F0F0')),
// VerticalDivider(thickness: 0.5, width: 1, color: HexColor.fromHex('#F0F0F0')),
SizedBox(height: 35, child: VerticalDivider(thickness: 0.5, color: HexColor.fromHex('#F0F0F0'), width: 0.5, )),

/// 昨日新增
_getCustomWidget(
@@ -88,9 +95,13 @@ class _TeamDataWidgetState extends State<TeamDataWidget> {
/// 自定义Widget
Widget _getCustomWidget({String text, String textColor, double textSize, String number, String numberColor, double numberSize, String icon}) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
/// Number
Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
/// nummber\
Text(number,
@@ -108,3 +119,4 @@ class _TeamDataWidgetState extends State<TeamDataWidget> {
);
}
}


+ 65
- 0
lib/widgets/team/details/team_details_month_data_widget.dart Переглянути файл

@@ -0,0 +1,65 @@
import 'package:zhiying_comm/zhiying_comm.dart';
import 'package:flutter/material.dart';

class TeamDetailsMonthDataWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container();
}




/// content
Widget _getContentWidget() {
return Container(
decoration: BoxDecoration(
color: HexColor.fromHex('#FFFFFF'),
borderRadius: BorderRadius.circular(10),
),
padding: const EdgeInsets.only(top: 31, bottom: 10),
child: Row(
children: <Widget>[
/// 今日贡献
_getLeftValueWidget(),

/// 分割线
VerticalDivider(width: 19, thickness: 0.5, color: HexColor.fromHex('#D8D8D8')),

/// 贡献收入
_getRightValueWidget(),
],
),
);
}

/// 左边
Widget _getLeftValueWidget() {
return _getCustomWidget(text: '自购订单(个)', textColor: '#999999', textSize: 11, number: '158.58', numberColor: '#333333', numberSize: 17, icon: 'sss');
}

/// 右边
Widget _getRightValueWidget() {
return _getCustomWidget(text: '预估收益(元)', textColor: '#999999', textSize: 11, number: '158.58', numberColor: '#333333', numberSize: 17, icon: 'sss');
}

/// 自定义Widget
Widget _getCustomWidget({String text, String textColor, double textSize, String number, String numberColor, double numberSize, String icon}) {
return Column(
children: <Widget>[
/// number
Text(number, style: TextStyle(color: HexColor.fromHex(numberColor), fontSize: numberSize, fontWeight: FontWeight.bold)),

/// text
Row(
children: <Widget>[
Text(text, style: TextStyle(color: HexColor.fromHex(textColor), fontSize: textSize)),

/// icon
Visibility(visible: !EmptyUtil.isEmpty(icon), child: Container(width: 11, height: 11, color: Colors.red))
],
)
],
);
}
}

+ 180
- 7
lib/widgets/team/fans/team_fans_item.dart Переглянути файл

@@ -12,35 +12,208 @@ class TeamFansItem extends StatefulWidget {
class _TeamFansItemState extends State<TeamFansItem> {
@override
Widget build(BuildContext context) {
return Container();
return _getMainWidget();
}

/// 主体视图
Widget _getMainWidget() {
return Container(
decoration: BoxDecoration(
color: HexColor.fromHex('#FFFFFF'),
borderRadius: BorderRadius.circular(10)
),
decoration: BoxDecoration(color: HexColor.fromHex('#FFFFFF'), borderRadius: BorderRadius.circular(10)),
margin: const EdgeInsets.only(left: 12.5, right: 12.5),
padding: const EdgeInsets.only(left: 20, right: 20, top: 17.5, bottom: 15),
child: Column(
children: <Widget>[

// 粉丝头像信息等
_getFansInfoWidget(),
// 微信号码
_getWXNumberInfoWidget(),
// 数据信息
_getDataWidget(),
],
),
);
}


/// 粉丝头像信息等
Widget _getFansInfoWidget() {
return Row(
children: <Widget>[
/// 头像
Container(width: 50, height: 50, color: Colors.red),
const SizedBox(width: 10),

/// 信息
Column(
children: <Widget>[
/// 会员等级 关系 昵称
RichText(
text: TextSpan(text: '', children: [
/// 等级
WidgetSpan(child: Container(width: 37, height: 13, color: Colors.red)),

/// 会员关系
WidgetSpan(child: Container(width: 13, height: 13, color: Colors.red, margin: const EdgeInsets.only(left: 3, right: 3))),

/// 会员名称
TextSpan(text: '温***哥', style: TextStyle(color: HexColor.fromHex('#333333'), fontSize: 12, fontWeight: FontWeight.bold))
]),
),

/// 手机号码
RichText(
text: TextSpan(text: '', children: [
/// 手机号码
TextSpan(text: '手机号:', style: TextStyle(color: HexColor.fromHex('#333333'), fontSize: 11)),
TextSpan(text: '124****6124', style: TextStyle(color: HexColor.fromHex('#333333'), fontSize: 11, fontFamily: 'Din', package: 'zhiying_base_widget')),

/// 复制按钮
WidgetSpan(child: Container(width: 11, height: 11, color: Colors.red, margin: const EdgeInsets.only(left: 3)))
]),
),
],
)
],
);
}

/// 微信号码信息
Widget _getWXNumberInfoWidget() {
return Container(
padding: const EdgeInsets.only(left: 9, right: 10, bottom: 6.5, top: 6.5),
decoration: BoxDecoration(
color: HexColor.fromHex('#F7F7F7'),
borderRadius: BorderRadius.circular(10),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
/// 微信号码
RichText(
text: TextSpan(text: '微信号:', style: TextStyle(color: HexColor.fromHex('#999999'), fontSize: 11, fontWeight: FontWeight.bold), children: [
TextSpan(
text: '54A78',
style: TextStyle(fontWeight: FontWeight.bold, color: HexColor.fromHex('#333333'), fontSize: 11, fontFamily: 'Din', package: 'zhiying_base_widget')),
WidgetSpan(child: Container(margin: const EdgeInsets.only(left: 5.5), color: Colors.red, width: 11, height: 11))
]),
),

/// 最近登陆时间
Text('最近登陆 2019-06-28', style: TextStyle(color: HexColor.fromHex('#909090'), fontSize: 11, fontFamily: 'Din', package: 'zhiying_base_widget'))
],
),
);
}

/// 数据信息
Widget _getDataWidget() {
return Row(
children: <Widget>[
/// 左边数据
Column(
children: <Widget>[
/// 邀请人数(人)
_getCustomWidget(
text: '邀请人数(人)',
textColor: '#333333',
textSize: 10,
number: '1578',
numberColor: '#FF4242',
numberSize: 20,
),

/// 今日邀请 & 本月邀请
Row(
children: <Widget>[
/// 今日邀请
_getCustomWidget(
text: '今日邀请',
textColor: '#909090',
textSize: 10,
number: '3258',
numberColor: '#333333',
numberSize: 15,
),

/// 本月邀请
_getCustomWidget(
text: '本月邀请',
textColor: '#909090',
textSize: 10,
number: '3258',
numberColor: '#333333',
numberSize: 15,
),
],
)
],
),

/// 分割线
VerticalDivider(width: 65.5, thickness: 0.5),

/// 右边数据
Column(
children: <Widget>[
/// 累计收益(¥)
_getCustomWidget(
text: '累计收益(¥)',
textColor: '#333333',
textSize: 10,
number: '157.54',
numberColor: '#FF4242',
numberSize: 20,
),

/// 近7天收益 & 本月收益
Row(
children: <Widget>[
/// 今日邀请
_getCustomWidget(
text: '近7天收益',
textColor: '#909090',
textSize: 10,
number: '4.12',
numberColor: '#333333',
numberSize: 15,
),

/// 本月邀请
_getCustomWidget(
text: '本月收益',
textColor: '#909090',
textSize: 10,
number: '528.14',
numberColor: '#333333',
numberSize: 15,
),
],
)
],
)
],
);
}

/// 自定义Widget(数字加粗)
Widget _getCustomWidget({String text, String textColor, double textSize, String number, String numberColor, double numberSize, String icon}) {
return Column(
children: <Widget>[
/// Number
Row(
children: <Widget>[
/// nummber\
Text(number,
style: TextStyle(color: HexColor.fromHex(numberColor), fontSize: numberSize, fontWeight: FontWeight.bold, fontFamily: 'Din', package: 'zhiying_base_widget')),
const SizedBox(width: 3),

/// icon
Visibility(visible: !EmptyUtil.isEmpty(icon), child: Container(height: 7, width: 5, color: Colors.red))
],
),

/// Text
Text(text, style: TextStyle(color: HexColor.fromHex(textColor), fontSize: textSize))
],
);
}
}

+ 119
- 54
lib/widgets/team/recommend/team_recommend_widget.dart Переглянути файл

@@ -5,9 +5,9 @@ import 'package:zhiying_comm/zhiying_comm.dart';
/// 我的团队 - 我的推荐人
///
class TeamRecommendWidget extends StatefulWidget {
final Map<String, dynamic> data;
const TeamRecommendWidget(this.data);
// final Map<String, dynamic> data;
//
// const TeamRecommendWidget(this.data);

@override
_TeamRecommendWidgetState createState() => _TeamRecommendWidgetState();
@@ -16,7 +16,10 @@ class TeamRecommendWidget extends StatefulWidget {
class _TeamRecommendWidgetState extends State<TeamRecommendWidget> {
@override
Widget build(BuildContext context) {
return Container();
return Container(
margin: const EdgeInsets.only(left: 12.5, right: 12.5, top: 10.5),
child: _getMainWidget(),
);
}

/// 按钮点击事件
@@ -25,12 +28,21 @@ class _TeamRecommendWidgetState extends State<TeamRecommendWidget> {
/// 主体Widget
Widget _getMainWidget() {
return Container(
padding: const EdgeInsets.only(left: 10, bottom: 12, right: 10),
decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: Colors.white),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
/// 左上角的Icon
_getLeftTopWidget(),

const SizedBox(height: 6),

/// 数据视图
Visibility(
visible: true,
replacement: _getInputCombWidget(),
child: Padding(padding: const EdgeInsets.only(left: 10), child: _getDataWidget())),
],
),
);
@@ -38,38 +50,36 @@ class _TeamRecommendWidgetState extends State<TeamRecommendWidget> {

/// 我的推荐人IconWidget(左上角的ICON)
Widget _getLeftTopWidget() {
return Container(width: 73.5, height: 23.5, color: Colors.red);
return Transform.translate(offset: Offset(0, -4.5), child: Container(width: 80, height: 28, color: Colors.red));
}

/// 输入框
Widget _getInputWidget() {
/// 没邀请人的Widget
Widget _getInputCombWidget() {
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(30),
color: HexColor.fromHex('#F7F7F7'),
),
margin: const EdgeInsets.only(left: 2.5, right: 2.5),
width: double.infinity,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
// crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
/// 输入框
Row(
children: <Widget>[
/// 输入框
Expanded(
child: TextField(
decoration: InputDecoration(
border: InputBorder.none,
focusedBorder: InputBorder.none,
focusedErrorBorder: InputBorder.none,
errorBorder: InputBorder.none,
disabledBorder: InputBorder.none,
enabledBorder: InputBorder.none,
filled: true,
fillColor: Colors.transparent),
Container(
height: 30,
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(30),
color: HexColor.fromHex('#F7F7F7'),
),
padding: const EdgeInsets.only(top: 3.5, bottom: 3.5, right: 3, left: 13),
child: Row(
children: <Widget>[
Expanded(
child: _getInputWidget(),
),
),
/// 按钮
_getAddButtomWidget(),
],
/// 添加的按钮
_getAddButtomWidget(),
],
),
),

const SizedBox(height: 10.5),
@@ -81,22 +91,60 @@ class _TeamRecommendWidgetState extends State<TeamRecommendWidget> {
);
}


/// 输入框的
Widget _getInputWidget(){
return TextField(
style:TextStyle(color: HexColor.fromHex('#000000'), fontSize: 12, textBaseline: TextBaseline.alphabetic),

decoration: InputDecoration(
border: InputBorder.none,
enabledBorder: InputBorder.none,
disabledBorder: InputBorder.none,
errorBorder: InputBorder.none,
focusedErrorBorder: InputBorder.none,
focusedBorder: InputBorder.none,
hintText: '输入邀请人ID',
isDense: true,
filled: true,
fillColor: Colors.transparent,
contentPadding: EdgeInsets.zero,
hintStyle: TextStyle(color: HexColor.fromHex('#909090'), fontSize: 12, textBaseline: TextBaseline.alphabetic),
),
);
}

/// 添加的按钮
Widget _getAddButtomWidget() {
// return Material(
// child: Container(
// height: 24,
// color: Colors.white,
// child: RaisedButton(
// padding: EdgeInsets.zero,
// child: Text('添加', style: TextStyle(fontSize: 13)),
// textColor: HexColor.fromHex('#FFFFFF'),
// color: HexColor.fromHex('#F94B47'),
// disabledColor: HexColor.fromHex('#F94B47'),
// disabledTextColor: HexColor.fromHex('#FFFFFF'),
// elevation: 5,
// shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24 / 2)),
// onPressed: () => _onClickListener(),
// ),
// ),
// );

return Material(
child: Container(
height: 24,
width: double.infinity,
color: Colors.white,
child: RaisedButton(
child: Text('添加', style: TextStyle(fontSize: 13)),
textColor: HexColor.fromHex('#FFFFFF'),
color: HexColor.fromHex('#F94B47'),
disabledColor: HexColor.fromHex('#F94B47'),
disabledTextColor: HexColor.fromHex('#FFFFFF'),
elevation: 5,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24 / 2)),
onPressed: () => _onClickListener(),
child: InkWell(
onTap: (){},
child: Container(
padding: const EdgeInsets.only(left: 21, right: 21, top: 2.5, bottom: 2.5),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(30),
color: HexColor.fromHex('#F94B47')
),
child: Text('添加', style: TextStyle(fontSize: 13, color: HexColor.fromHex('#FFFFFF'))),
),
),
);
@@ -105,6 +153,7 @@ class _TeamRecommendWidgetState extends State<TeamRecommendWidget> {
/// 数据视图
Widget _getDataWidget() {
return Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
/// 头像widget
_getAvatarWidget(),
@@ -128,29 +177,45 @@ class _TeamRecommendWidgetState extends State<TeamRecommendWidget> {

/// 数据右边视图,头像右边的widget
Widget _getDataRightWidget() {
return Column(
children: <Widget>[
/// 昵称
_getNickNameWidget(),
return SizedBox(
height: 55,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
/// 昵称
_getNickNameWidget(),

/// 手机号
_getPhoneNumberWidget(),
/// 手机号
_getPhoneNumberWidget(),

/// 微信号
_getWXWidget()
],
/// 微信号
_getWXWidget()
],
),
);
}

/// 昵称
Widget _getNickNameWidget() {
// return RichText(
// text: TextSpan(text: '毛毛虫', style: TextStyle(fontSize: 14, color: HexColor.fromHex('#000000'), fontWeight: FontWeight.bold),
// children: [
// TextSpan(text: '邀请码:', style: TextStyle(fontSize: 11, color: HexColor.fromHex('#909090'), fontWeight: FontWeight.w400)),
// TextSpan(text: '123456', style: TextStyle(fontSize: 11, color: HexColor.fromHex('#909090'), fontWeight: FontWeight.w400)),
// ]
// ),
// );

return Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
/// 昵称
Text('毛毛虫', style: TextStyle(fontSize: 14, color: HexColor.fromHex('#000000'), fontWeight: FontWeight.bold)),
const SizedBox(width: 6),
Text('邀请码:', style: TextStyle(fontSize: 11, color: HexColor.fromHex('#909090'))),
Text('123456', style: TextStyle(fontSize: 11, color: HexColor.fromHex('#909090'))),
Text('123456', style: TextStyle(fontSize: 11, color: HexColor.fromHex('#909090'), fontFamily: 'Din', package: 'zhiying_base_widget')),
],
);
}
@@ -160,7 +225,7 @@ class _TeamRecommendWidgetState extends State<TeamRecommendWidget> {
return Row(
children: <Widget>[
Text('手机号:', style: TextStyle(fontSize: 11, color: HexColor.fromHex('#AFAFAF'))),
Text('12354678910', style: TextStyle(fontSize: 11, color: HexColor.fromHex('#AFAFAF'))),
Text('12354678910', style: TextStyle(fontSize: 11, color: HexColor.fromHex('#AFAFAF'), fontFamily: 'Din', package: 'zhiying_base_widget')),
const SizedBox(width: 6),

/// 拷贝按钮
@@ -174,7 +239,7 @@ class _TeamRecommendWidgetState extends State<TeamRecommendWidget> {
return Row(
children: <Widget>[
Text('微信号:', style: TextStyle(fontSize: 11, color: HexColor.fromHex('#AFAFAF'))),
Text('12354678910', style: TextStyle(fontSize: 11, color: HexColor.fromHex('#AFAFAF'))),
Text('12354678910', style: TextStyle(fontSize: 11, color: HexColor.fromHex('#AFAFAF'), fontFamily: 'Din', package: 'zhiying_base_widget')),
const SizedBox(width: 6),

/// 拷贝按钮


Завантаження…
Відмінити
Зберегти