diff --git a/lib/model/manager/visitor_list_item_model.dart b/lib/model/manager/visitor_list_item_model.dart index 2b38fca1..618e59a7 100644 --- a/lib/model/manager/visitor_list_item_model.dart +++ b/lib/model/manager/visitor_list_item_model.dart @@ -11,6 +11,7 @@ class VisitorListItemModel { String effectiveTime; DateTime get date => DateUtil.getDateTime(effectiveTime); + bool get drive => isDrive == 1; VisitorListItemModel( {this.id, diff --git a/lib/ui/manager/visitor/visitor_list_item.dart b/lib/ui/manager/visitor/visitor_list_item.dart index 14319de5..aba1577a 100644 --- a/lib/ui/manager/visitor/visitor_list_item.dart +++ b/lib/ui/manager/visitor/visitor_list_item.dart @@ -61,7 +61,7 @@ class _VisitorListItemState extends State { return MaterialButton( onPressed: () { if (!outDate) { - VisitorPassportPage().to(); + VisitorPassportPage(model: widget.model).to(); } }, color: Colors.white, diff --git a/lib/ui/manager/visitor/visitor_passport_page.dart b/lib/ui/manager/visitor/visitor_passport_page.dart index 0460caff..d7dd837e 100644 --- a/lib/ui/manager/visitor/visitor_passport_page.dart +++ b/lib/ui/manager/visitor/visitor_passport_page.dart @@ -1,5 +1,18 @@ // Flutter imports: +import 'dart:typed_data'; +import 'dart:ui' as ui; + +import 'package:akuCommunity/base/base_style.dart'; +import 'package:akuCommunity/const/resource.dart'; +import 'package:akuCommunity/model/manager/visitor_list_item_model.dart'; +import 'package:akuCommunity/widget/buttons/bottom_button.dart'; +import 'package:bot_toast/bot_toast.dart'; +import 'package:common_utils/common_utils.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/services.dart'; +import 'package:fluwx/fluwx.dart'; +import 'package:qr_flutter/qr_flutter.dart'; // Package imports: import 'package:velocity_x/velocity_x.dart'; @@ -9,13 +22,15 @@ import 'package:akuCommunity/utils/headers.dart'; import 'package:akuCommunity/widget/bee_back_button.dart'; class VisitorPassportPage extends StatefulWidget { - VisitorPassportPage({Key key}) : super(key: key); + final VisitorListItemModel model; + VisitorPassportPage({Key key, @required this.model}) : super(key: key); @override _VisitorPassportPageState createState() => _VisitorPassportPageState(); } class _VisitorPassportPageState extends State { + GlobalKey _repaintKey = GlobalKey(); @override Widget build(BuildContext context) { return Scaffold( @@ -27,23 +42,113 @@ class _VisitorPassportPageState extends State { centerTitle: true, title: '访客通行证'.text.white.make(), ), - body: ListView( - children: [ - 64.hb, - '宁波华茂悦峰'.text.size(40.sp).white.bold.make().centered(), - '1幢-1单元-702室'.text.size(30.sp).white.make().centered(), - 32.hb, - Container( - height: 600.w, - width: 600.w, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(16.w), - ), - // child: , - //TODO 二维码显示 - ).centered(), - ], + body: RepaintBoundary( + key: _repaintKey, + child: ListView( + children: [ + 64.hb, + '宁波华茂悦峰'.text.size(40.sp).white.bold.make().centered(), + '1幢-1单元-702室'.text.size(30.sp).white.make().centered(), + 32.hb, + Container( + width: 600.w, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16.w), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + 32.hb, + [ + 32.wb, + [ + Image.asset( + R.ASSETS_ICONS_USER_ICON_WDFK_PNG, + color: ktextSubColor, + height: 40.w, + width: 40.w, + ), + 16.wb, + widget.model.name.text + .size(36.sp) + .bold + .overflow(TextOverflow.ellipsis) + .make() + .expand(), + ].row().expand(), + [ + Image.asset( + R.ASSETS_ICONS_USER_ICON_WDC_PNG, + color: ktextSubColor, + height: 40.w, + width: 40.w, + ), + 16.wb, + (widget.model.drive ? '无车辆信息' : widget.model.carNum) + .text + .size(36.sp) + .bold + .overflow(TextOverflow.ellipsis) + .make() + .expand(), + ].row().expand(), + 32.wb, + ].row(), + 16.hb, + '有效时间:${DateUtil.formatDate( + widget.model.date, + format: 'yyyy-MM-dd', + )}' + .text + .color(Color(0xFF999999)) + .size(24.sp) + .make() + .pSymmetric(h: 32.w), + 20.hb, + Divider(height: 1.w), + 32.hb, + SizedBox( + height: 260.w, + width: 260.w, + child: QrImage( + data: widget.model.accessCode.toString(), + ), + ).centered(), + 32.hb, + Divider(height: 1.w), + '进入小区时,请出示此通行证给门岗' + .text + .size(24.sp) + .color(Color(0xFF999999)) + .make() + .centered() + .box + .height(64.w) + .make(), + ], + ), + //TODO 二维码显示 + ).centered(), + ], + ).box.color(Color(0xFF333333)).make(), + ), + bottomNavigationBar: BottomButton( + onPressed: () async { + VoidCallback cancel = BotToast.showLoading(); + RenderRepaintBoundary boundary = + _repaintKey.currentContext.findRenderObject(); + ui.Image image = await boundary.toImage(pixelRatio: 3); + ByteData byteData = + await image.toByteData(format: ui.ImageByteFormat.png); + Uint8List png = byteData.buffer.asUint8List(); + cancel(); + shareToWeChat(WeChatShareImageModel( + WeChatImage.binary(png, suffix: '.png'), + scene: WeChatScene.SESSION, + )); + }, + child: '发送给访客'.text.bold.make(), ), ); } diff --git a/pubspec.yaml b/pubspec.yaml index 06b1b3ac..913972d4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -87,7 +87,7 @@ dependencies: #用户存储路径 path_provider: ^1.6.18 - fluwx: ^2.3.0 + fluwx: ^2.5.0+1 get: velocity_x: ^1.3.1 hive: