| @@ -3,6 +3,7 @@ import 'dart:convert' as convert; | |||||
| import 'package:cached_network_image/cached_network_image.dart'; | import 'package:cached_network_image/cached_network_image.dart'; | ||||
| import 'package:flutter/cupertino.dart'; | import 'package:flutter/cupertino.dart'; | ||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
| import 'package:provider/provider.dart'; | |||||
| import 'package:zhiying_base_widget/utils/contants.dart'; | import 'package:zhiying_base_widget/utils/contants.dart'; | ||||
| import 'package:zhiying_comm/models/base/base_tab_model.dart'; | import 'package:zhiying_comm/models/base/base_tab_model.dart'; | ||||
| import 'package:zhiying_comm/util/image_util.dart'; | import 'package:zhiying_comm/util/image_util.dart'; | ||||
| @@ -105,12 +106,30 @@ class _HomePageState extends State<HomePage> { | |||||
| unselectedFontSize: 11, | unselectedFontSize: 11, | ||||
| currentIndex: _currentIndex, | currentIndex: _currentIndex, | ||||
| elevation: 0, | elevation: 0, | ||||
| onTap: ((index) { | |||||
| setState(() { | |||||
| _currentIndex = index; | |||||
| }); | |||||
| onTap: ((index) async { | |||||
| BaseTabModel model = BaseTabModel.fromJson(tabs[index]); | |||||
| if (await _checkLimit(model)) { | |||||
| setState(() { | |||||
| _currentIndex = index; | |||||
| }); | |||||
| } | |||||
| }), | }), | ||||
| //底部导航栏 | //底部导航栏 | ||||
| items: items); | items: items); | ||||
| } | } | ||||
| Future<bool> _checkLimit(BaseTabModel model) async { | |||||
| if (model.requiredLogin == '1') { | |||||
| UserInfoModel user = | |||||
| await Provider.of<UserInfoNotifier>(context, listen: false) | |||||
| .getUserInfoModel(); | |||||
| print(user.toString()); | |||||
| if (user?.token == null || user.token == '') { | |||||
| print('need login...'); | |||||
| RouterUtil.goLogin(context); | |||||
| return false; | |||||
| } | |||||
| } | |||||
| return true; | |||||
| } | |||||
| } | } | ||||
| @@ -0,0 +1,52 @@ | |||||
| import 'dart:async'; | |||||
| import 'package:zhiying_base_widget/pages/orders_page/models/order_filter_model.dart'; | |||||
| import 'package:zhiying_base_widget/pages/orders_page/models/order_model.dart'; | |||||
| import 'package:zhiying_comm/util/base_bloc.dart'; | |||||
| import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
| class OrderContentBloc extends BlocBase { | |||||
| List<OrderModel> _orders = List(); | |||||
| StreamController<List<OrderModel>> _ordersController = | |||||
| StreamController<List<OrderModel>>(); | |||||
| Stream<List<OrderModel>> get outData => _ordersController.stream; | |||||
| @override | |||||
| void dispose() { | |||||
| _ordersController.close(); | |||||
| _ordersController = null; | |||||
| } | |||||
| void loadData(OrderFilterModel filter) { | |||||
| Map<String, dynamic> params = filter.toJson(); | |||||
| params.removeWhere((key, value) => value == null || value == ''); | |||||
| NetUtil.request('/api/v1/order', method: NetMethod.POST, params: params, | |||||
| onCache: (data) { | |||||
| _loadData(data); | |||||
| }, onSuccess: (data) { | |||||
| _loadData(data); | |||||
| }); | |||||
| } | |||||
| void _loadData(dynamic data) { | |||||
| List list = data ?? []; | |||||
| OrderModel model = OrderModel(); | |||||
| model.itemId = '6918577752399759376'; | |||||
| model.imgUrl = | |||||
| 'https://t7.baidu.com/it/u=3616242789,1098670747&fm=79&app=86&size=h300&n=0&g=4n&f=jpeg?sec=1603444938&t=04aeb23595ac79d419be19ab92bea668'; | |||||
| model.title = '乐町百褶半身裙秋冬女2019新款复古麻花半身裙甜美百褶半身裙'; | |||||
| model.price = '108'; | |||||
| model.commission = '0'; | |||||
| model.commissionRate = '9.2'; | |||||
| _orders.add(model); | |||||
| _orders.addAll(list.map((item) { | |||||
| return OrderModel.fromJson(Map<String, dynamic>.from(item)); | |||||
| }).toList()); | |||||
| _ordersController.add(_orders); | |||||
| } | |||||
| } | |||||
| @@ -1,21 +1,45 @@ | |||||
| // 订单筛选条件 | // 订单筛选条件 | ||||
| class OrderFilterModel { | class OrderFilterModel { | ||||
| final String state; // 否 string 订单状态0已付款,1已收货,2成功,3失效 | |||||
| final String keyword; // 否 string 关键字 | |||||
| final String start_time; // 否 string 开始时间 | |||||
| final String end_time; // 否 string 结束时间 | |||||
| final String type; // 否 string 订单类型self自购, share分享, fans粉丝 | |||||
| final String provider; // 否 string 供应商taobao, jd, pdd, vip, kaola,suning,own自营 | |||||
| final String page_no; // 否 string 页码 | |||||
| final String page_size; | |||||
| String state; | |||||
| String keyword; | |||||
| String startTime; | |||||
| String endTime; | |||||
| String type; | |||||
| String provider; | |||||
| String pageNo; | |||||
| String pageSize; | |||||
| OrderFilterModel( | OrderFilterModel( | ||||
| {this.state, | {this.state, | ||||
| this.keyword, | this.keyword, | ||||
| this.start_time, | |||||
| this.end_time, | |||||
| this.startTime, | |||||
| this.endTime, | |||||
| this.type, | this.type, | ||||
| this.provider, | this.provider, | ||||
| this.page_no, | |||||
| this.page_size}); // 否 string 页数 | |||||
| this.pageNo, | |||||
| this.pageSize}); | |||||
| OrderFilterModel.fromJson(Map<String, dynamic> json) { | |||||
| state = json['state']; | |||||
| keyword = json['keyword']; | |||||
| startTime = json['start_time']; | |||||
| endTime = json['end_time']; | |||||
| type = json['type']; | |||||
| provider = json['provider']; | |||||
| pageNo = json['page_no']; | |||||
| pageSize = json['page_size']; | |||||
| } | |||||
| Map<String, dynamic> toJson() { | |||||
| final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
| data['state'] = this.state; | |||||
| data['keyword'] = this.keyword; | |||||
| data['start_time'] = this.startTime; | |||||
| data['end_time'] = this.endTime; | |||||
| data['type'] = this.type; | |||||
| data['provider'] = this.provider; | |||||
| data['page_no'] = this.pageNo; | |||||
| data['page_size'] = this.pageSize; | |||||
| return data; | |||||
| } | |||||
| } | } | ||||
| @@ -0,0 +1,36 @@ | |||||
| class OrderModel { | |||||
| String itemId; | |||||
| String title; | |||||
| String price; | |||||
| String commission; | |||||
| String commissionRate; | |||||
| String imgUrl; | |||||
| OrderModel( | |||||
| {this.itemId, | |||||
| this.title, | |||||
| this.price, | |||||
| this.commission, | |||||
| this.commissionRate, | |||||
| this.imgUrl}); | |||||
| OrderModel.fromJson(Map<String, dynamic> json) { | |||||
| itemId = json['item_id']; | |||||
| title = json['title']; | |||||
| price = json['price']; | |||||
| commission = json['commission']; | |||||
| commissionRate = json['commission_rate']; | |||||
| imgUrl = json['img_url']; | |||||
| } | |||||
| Map<String, dynamic> toJson() { | |||||
| final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
| data['item_id'] = this.itemId; | |||||
| data['title'] = this.title; | |||||
| data['price'] = this.price; | |||||
| data['commission'] = this.commission; | |||||
| data['commission_rate'] = this.commissionRate; | |||||
| data['img_url'] = this.imgUrl; | |||||
| return data; | |||||
| } | |||||
| } | |||||
| @@ -1,10 +1,13 @@ | |||||
| import 'package:event_bus/event_bus.dart'; | |||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
| import 'package:zhiying_base_widget/pages/orders_page/bloc/order_content_bloc.dart'; | |||||
| import 'package:zhiying_base_widget/pages/orders_page/models/order_filter_model.dart'; | |||||
| import 'package:zhiying_base_widget/pages/orders_page/models/order_model.dart'; | |||||
| import 'package:zhiying_base_widget/pages/orders_page/views/order_item_widget.dart'; | import 'package:zhiying_base_widget/pages/orders_page/views/order_item_widget.dart'; | ||||
| import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
| import 'package:zhiying_base_widget/widgets/empty/empty_widget.dart'; | |||||
| import 'package:zhiying_comm/util/base_bloc.dart'; | |||||
| class OrderContentPage extends StatefulWidget { | class OrderContentPage extends StatefulWidget { | ||||
| final EventBus filter; | |||||
| final OrderFilterModel filter; | |||||
| const OrderContentPage({Key key, this.filter}) : super(key: key); | const OrderContentPage({Key key, this.filter}) : super(key: key); | ||||
| @@ -13,22 +16,57 @@ class OrderContentPage extends StatefulWidget { | |||||
| } | } | ||||
| class _OrderContentPageState extends State<OrderContentPage> { | class _OrderContentPageState extends State<OrderContentPage> { | ||||
| @override | |||||
| Widget build(BuildContext context) { | |||||
| return BlocProvider<OrderContentBloc>( | |||||
| bloc: OrderContentBloc(), | |||||
| child: OrderContentContainer(widget.filter), | |||||
| ); | |||||
| } | |||||
| } | |||||
| class OrderContentContainer extends StatefulWidget { | |||||
| final OrderFilterModel filter; | |||||
| const OrderContentContainer(this.filter, {Key key}) : super(key: key); | |||||
| @override | |||||
| _OrderContentContainerState createState() => _OrderContentContainerState(); | |||||
| } | |||||
| class _OrderContentContainerState extends State<OrderContentContainer> { | |||||
| OrderContentBloc _bloc; | |||||
| @override | @override | ||||
| void initState() { | void initState() { | ||||
| // 每次滑动刷新数据 | |||||
| widget.filter?.streamController?.add((filter) { | |||||
| Logger.debug(filter.toString()); | |||||
| }); | |||||
| _bloc = BlocProvider.of(context); | |||||
| _bloc.loadData(widget.filter); | |||||
| super.initState(); | super.initState(); | ||||
| } | } | ||||
| @override | @override | ||||
| Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
| print(context.toString()); | print(context.toString()); | ||||
| return ListView.builder( | |||||
| itemCount: 20, | |||||
| itemBuilder: (context, index) { | |||||
| return OrderItemWidget(); | |||||
| return StreamBuilder<List<OrderModel>>( | |||||
| stream: _bloc.outData, | |||||
| builder: (BuildContext context, AsyncSnapshot snapshot) { | |||||
| if (snapshot.data == null) { | |||||
| return Container(); | |||||
| } | |||||
| List<OrderModel> orders = snapshot.data; | |||||
| if (orders.length == 0) { | |||||
| return Container( | |||||
| child: Center( | |||||
| child: EmptyWidget(tips: '暂无订单,快去下一单吧'), | |||||
| ), | |||||
| ); | |||||
| } | |||||
| return ListView.builder( | |||||
| itemCount: orders.length, | |||||
| itemBuilder: (context, index) { | |||||
| return OrderItemWidget(orders[index]); | |||||
| }); | |||||
| }); | }); | ||||
| } | } | ||||
| } | } | ||||
| @@ -1,4 +1,3 @@ | |||||
| import 'package:event_bus/event_bus.dart'; | |||||
| import 'package:flutter/cupertino.dart'; | import 'package:flutter/cupertino.dart'; | ||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
| import 'package:zhiying_base_widget/pages/orders_page/models/order_filter_model.dart'; | import 'package:zhiying_base_widget/pages/orders_page/models/order_filter_model.dart'; | ||||
| @@ -80,7 +79,6 @@ class _OrdersContainerState extends State<_OrdersContainer> | |||||
| TabController _tabController; | TabController _tabController; | ||||
| GlobalKey _tabKey = GlobalKey(); | GlobalKey _tabKey = GlobalKey(); | ||||
| final EventBus _eventBus = EventBus(); | |||||
| final OrderFilterModel _filter = OrderFilterModel(); | final OrderFilterModel _filter = OrderFilterModel(); | ||||
| bool _isFilterShow = false; | bool _isFilterShow = false; | ||||
| @@ -99,22 +97,22 @@ class _OrdersContainerState extends State<_OrdersContainer> | |||||
| _tabController = TabController(length: 6, vsync: this); | _tabController = TabController(length: 6, vsync: this); | ||||
| _contents = [ | _contents = [ | ||||
| OrderContentPage( | OrderContentPage( | ||||
| filter: _eventBus, | |||||
| filter: _filter, | |||||
| ), | ), | ||||
| OrderContentPage( | OrderContentPage( | ||||
| filter: _eventBus, | |||||
| filter: _filter, | |||||
| ), | ), | ||||
| OrderContentPage( | OrderContentPage( | ||||
| filter: _eventBus, | |||||
| filter: _filter, | |||||
| ), | ), | ||||
| OrderContentPage( | OrderContentPage( | ||||
| filter: _eventBus, | |||||
| filter: _filter, | |||||
| ), | ), | ||||
| OrderContentPage( | OrderContentPage( | ||||
| filter: _eventBus, | |||||
| filter: _filter, | |||||
| ), | ), | ||||
| OrderContentPage( | OrderContentPage( | ||||
| filter: _eventBus, | |||||
| filter: _filter, | |||||
| ), | ), | ||||
| ]; | ]; | ||||
| super.initState(); | super.initState(); | ||||
| @@ -152,7 +150,13 @@ class _OrdersContainerState extends State<_OrdersContainer> | |||||
| ), | ), | ||||
| Visibility( | Visibility( | ||||
| visible: _isFilterShow, | visible: _isFilterShow, | ||||
| child: OrderFilterWidget(), | |||||
| child: OrderFilterWidget( | |||||
| onDismiss: () { | |||||
| setState(() { | |||||
| _isFilterShow = false; | |||||
| }); | |||||
| }, | |||||
| ), | |||||
| ) | ) | ||||
| ], | ], | ||||
| ), | ), | ||||
| @@ -2,6 +2,10 @@ import 'package:flutter/material.dart'; | |||||
| import 'package:zhiying_base_widget/widgets/others/action_date_alert/action_date_alert.dart'; | import 'package:zhiying_base_widget/widgets/others/action_date_alert/action_date_alert.dart'; | ||||
| class OrderFilterWidget extends StatefulWidget { | class OrderFilterWidget extends StatefulWidget { | ||||
| final VoidCallback onDismiss; | |||||
| const OrderFilterWidget({Key key, this.onDismiss}) : super(key: key); | |||||
| @override | @override | ||||
| _OrderFilterWidgetState createState() => _OrderFilterWidgetState(); | _OrderFilterWidgetState createState() => _OrderFilterWidgetState(); | ||||
| } | } | ||||
| @@ -9,26 +13,32 @@ class OrderFilterWidget extends StatefulWidget { | |||||
| class _OrderFilterWidgetState extends State<OrderFilterWidget> { | class _OrderFilterWidgetState extends State<OrderFilterWidget> { | ||||
| @override | @override | ||||
| Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
| return Container( | |||||
| width: double.infinity, | |||||
| height: double.infinity, | |||||
| color: Color(0x55555555), | |||||
| child: Column( | |||||
| mainAxisAlignment: MainAxisAlignment.start, | |||||
| children: <Widget>[ | |||||
| _creteTitle('订单来源'), | |||||
| _createTags(), | |||||
| _creteTitle('订单类型'), | |||||
| _createTags(), | |||||
| _creteTitle('订单时间'), | |||||
| _creteTime(), | |||||
| Container( | |||||
| width: double.infinity, | |||||
| height: 0.5, | |||||
| color: Color(0xffe3e3e3), | |||||
| return GestureDetector( | |||||
| onTap: widget.onDismiss, | |||||
| child: Container( | |||||
| width: double.infinity, | |||||
| height: double.infinity, | |||||
| color: Color(0x55555555), | |||||
| child: GestureDetector( | |||||
| onTap: () {}, | |||||
| child: Column( | |||||
| mainAxisAlignment: MainAxisAlignment.start, | |||||
| children: <Widget>[ | |||||
| _creteTitle('订单来源'), | |||||
| _createTags(), | |||||
| _creteTitle('订单类型'), | |||||
| _createTags(), | |||||
| _creteTitle('订单时间'), | |||||
| _creteTime(), | |||||
| Container( | |||||
| width: double.infinity, | |||||
| height: 0.5, | |||||
| color: Color(0xffe3e3e3), | |||||
| ), | |||||
| _createButtons(), | |||||
| ], | |||||
| ), | ), | ||||
| _createButtons(), | |||||
| ], | |||||
| ), | |||||
| ), | ), | ||||
| ); | ); | ||||
| } | } | ||||
| @@ -60,12 +70,13 @@ class _OrderFilterWidgetState extends State<OrderFilterWidget> { | |||||
| runSpacing: 10, | runSpacing: 10, | ||||
| children: List.generate(10, (index) { | children: List.generate(10, (index) { | ||||
| return Container( | return Container( | ||||
| padding: EdgeInsets.only(left: 8, right: 8, top: 4, bottom: 4), | |||||
| padding: EdgeInsets.only(left: 12, right: 12, top: 6, bottom: 6), | |||||
| decoration: BoxDecoration( | decoration: BoxDecoration( | ||||
| color: Colors.blue, borderRadius: BorderRadius.circular(5)), | |||||
| color: Color(0xfff1f1f1), | |||||
| borderRadius: BorderRadius.circular(5)), | |||||
| child: Text( | child: Text( | ||||
| 'aaaa', | |||||
| style: TextStyle(fontSize: 12), | |||||
| '全部', | |||||
| style: TextStyle(fontSize: 12, color: Color(0xff999999)), | |||||
| ), | ), | ||||
| ); | ); | ||||
| }).toList(), | }).toList(), | ||||
| @@ -1,6 +1,12 @@ | |||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
| import 'package:zhiying_base_widget/pages/orders_page/models/order_model.dart'; | |||||
| import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
| class OrderItemWidget extends StatelessWidget { | class OrderItemWidget extends StatelessWidget { | ||||
| final OrderModel model; | |||||
| const OrderItemWidget(this.model, {Key key}) : super(key: key); | |||||
| @override | @override | ||||
| Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
| return Container( | return Container( | ||||
| @@ -56,7 +62,13 @@ class OrderItemWidget extends StatelessWidget { | |||||
| margin: EdgeInsets.only(right: 10), | margin: EdgeInsets.only(right: 10), | ||||
| width: 96, | width: 96, | ||||
| height: 96, | height: 96, | ||||
| color: Colors.black12, | |||||
| child: ClipRRect( | |||||
| borderRadius: BorderRadius.circular(8), | |||||
| child: CachedNetworkImage( | |||||
| imageUrl: model.imgUrl ?? '', | |||||
| fit: BoxFit.cover, | |||||
| ), | |||||
| ), | |||||
| ), | ), | ||||
| Expanded( | Expanded( | ||||
| child: Column( | child: Column( | ||||
| @@ -80,20 +92,20 @@ class OrderItemWidget extends StatelessWidget { | |||||
| padding: EdgeInsets.only(left: 2, right: 2, top: 3, bottom: 3), | padding: EdgeInsets.only(left: 2, right: 2, top: 3, bottom: 3), | ||||
| margin: EdgeInsets.only(right: 4), | margin: EdgeInsets.only(right: 4), | ||||
| child: Text( | child: Text( | ||||
| '类型', | |||||
| '淘宝', | |||||
| style: TextStyle( | style: TextStyle( | ||||
| fontSize: 9, | fontSize: 9, | ||||
| height: 1, | height: 1, | ||||
| color: Colors.purpleAccent, | |||||
| color: Colors.white, | |||||
| ), | ), | ||||
| ), | ), | ||||
| decoration: BoxDecoration( | decoration: BoxDecoration( | ||||
| color: Colors.amber, borderRadius: BorderRadius.circular(2.5)), | |||||
| color: Colors.redAccent, borderRadius: BorderRadius.circular(2.5)), | |||||
| ), | ), | ||||
| )); | )); | ||||
| list.add( | list.add( | ||||
| TextSpan( | TextSpan( | ||||
| text: '桶装水抽水器饮水机泵器动桶装水抽水器饮水机泵器动', | |||||
| text: model.title, | |||||
| style: TextStyle( | style: TextStyle( | ||||
| fontSize: 15, | fontSize: 15, | ||||
| color: Color(0xff333333), | color: Color(0xff333333), | ||||
| @@ -1,4 +1,5 @@ | |||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
| import 'package:zhiying_base_widget/widgets/search/widget/my_tab.dart'; | |||||
| class OrderTabbarWidget extends StatelessWidget { | class OrderTabbarWidget extends StatelessWidget { | ||||
| final TabController controller; | final TabController controller; | ||||
| @@ -25,9 +26,16 @@ class OrderTabbarWidget extends StatelessWidget { | |||||
| controller: controller, | controller: controller, | ||||
| isScrollable: true, | isScrollable: true, | ||||
| indicatorSize: TabBarIndicatorSize.label, | indicatorSize: TabBarIndicatorSize.label, | ||||
| tabs: titles | |||||
| .map((title) => OrderTabbarItemWidget(title: title)) | |||||
| .toList(), | |||||
| // tabs: widgets, | |||||
| indicatorColor: Color(0xffff4242), | |||||
| labelColor: Color(0xffff4242), | |||||
| unselectedLabelColor: Color(0xff999999), | |||||
| tabs: titles.map((item) { | |||||
| return MyTab( | |||||
| // icon: CachedNetworkImage(imageUrl: item?.with_icon_color ?? '', width: 14,), | |||||
| text: item, | |||||
| ); | |||||
| }).toList(), | |||||
| ), | ), | ||||
| ), | ), | ||||
| GestureDetector( | GestureDetector( | ||||
| @@ -52,8 +60,10 @@ class OrderTabbarWidget extends StatelessWidget { | |||||
| class OrderTabbarItemWidget extends StatelessWidget { | class OrderTabbarItemWidget extends StatelessWidget { | ||||
| final String title; | final String title; | ||||
| final bool isSelected; | |||||
| const OrderTabbarItemWidget({Key key, this.title}) : super(key: key); | |||||
| const OrderTabbarItemWidget({Key key, this.title, this.isSelected = false}) | |||||
| : super(key: key); | |||||
| @override | @override | ||||
| Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
| @@ -61,7 +71,8 @@ class OrderTabbarItemWidget extends StatelessWidget { | |||||
| height: 26, | height: 26, | ||||
| child: Text( | child: Text( | ||||
| title, | title, | ||||
| style: TextStyle(color: Color(0xFFFF4242)), | |||||
| style: TextStyle( | |||||
| color: isSelected ? Color(0xFFFF4242) : Color(0xff999999)), | |||||
| ), | ), | ||||
| ); | ); | ||||
| } | } | ||||