import 'dart:io'; import 'dart:typed_data'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:chat/data/UserData.dart'; import 'package:chat/data/WebData.dart'; import 'package:chat/data/constants.dart'; import 'package:chat/generated/i18n.dart'; import 'package:chat/utils/CustomUI.dart'; import 'package:chat/utils/HttpUtil.dart'; import 'package:chat/utils/PicSwiper.dart'; import 'package:chat/utils/file_cache_mgr.dart'; import 'package:chat/utils/screen.dart'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:multi_image_picker/multi_image_picker.dart'; import 'package:oktoast/oktoast.dart'; import '../data/UserData.dart'; import '../utils/TokenMgr.dart'; enum reason { advertising, rail, breakAppointment, sex, liar, } const int MaxImgNum = 4; class InformUserPage extends StatefulWidget { @required final userId; final programId; final isProgram; @required final bool isMan; InformUserPage( {Key key, this.userId, this.programId, this.isMan = false, this.isProgram = false}) : super(key: key); _InformUserPageState createState() => _InformUserPageState(); } class _InformUserPageState extends State { int _socialType = 0; bool parkHidden = false; bool distanceHidden = false; bool msgHidden = false; String explain = ''; //List imgFileList = []; //上传图片地址 List imgUrlList = []; BoxDecoration _getCardDecoration() { return new BoxDecoration(color: Colors.white); } @override void initState() { super.initState(); print('InformUserPage initState'); } @override Widget build(BuildContext context) { Widget appBar = new AppBar( title: Text( I18n.of(context).anonymous_report, textScaleFactor: 1.0, ), leading: CustomUI.buildCustomLeading(context), centerTitle: true, actions: [ new Container( alignment: Alignment.center, child: new InkWell( child: new Padding( padding: EdgeInsets.only(right: 15, left: 15, top: 10, bottom: 10), child: new Text(I18n.of(context).submit, textScaleFactor: 1.0, style: Constants.AppBarActionTextStyle), ), onTap: () async { if (imgUrlList == null || imgUrlList.length == 0) { showToast(I18n.of(context).bad_evaluate); return; } var data = { "reportuserId": UserData().basicInfo.userId, "userid": widget.userId, }; data['sign'] = TokenMgr().getSign(data); data['type'] = widget.programId == null ? 1 : (widget.isProgram ? 2 : 3); data['objectId'] = widget.programId == null ? 0 : widget.programId; data['reason'] = _socialType + 1; String temp = ""; imgUrlList.forEach((str) { temp += (temp == "" ? WebData().deleteDemain(str) : '|${WebData().deleteDemain(str)}'); }); data["imgurl"] = temp; data["explain"] = explain; Response res = await HttpUtil() .post('report/user/insert', data: data, isShowLoading: true); Map resData = res.data; if (resData['code'] == 0) { CustomUI.buildOneConfirm(context, I18n.of(context).waiting_results, I18n.of(context).ok, () { Navigator.of(context).pop(); Navigator.of(context).pop(); }, failcallbak: () { Navigator.of(context).pop(); }); } else { showToast(resData['msg']); } }, ), ) ], ); return Scaffold( body: SafeArea( child: Center( child: Container( height: MediaQuery.of(context).size.height, width: MediaQuery.of(context).size.width, child: _buildBody(), ), )), appBar: appBar, ); } Widget _buildBody() { return new ListView( children: [ _userDetail(), _buildMoreInfo(), _buildTips(), ], ); } Widget _buildTips() { return Container( margin: EdgeInsets.only(top: 5, left: 30, right: 30), child: Text( I18n.of(context).if_something, textScaleFactor: 1.0, style: TextStyle(fontSize: 12, color: Colors.grey[700]), textAlign: TextAlign.center, ), ); } //下划线 Widget _buildDivider() { return new Container( margin: EdgeInsets.zero, padding: EdgeInsets.zero, height: 1, width: MediaQuery.of(context).size.width, child: new Divider( color: Colors.grey[300], ), ); } void _sendPicture() async { List resultList = List(); resultList = await MultiImagePicker.pickImages( maxImages: MaxImgNum - imgUrlList.length, enableCamera: false, selectedAssets: [], cupertinoOptions: CupertinoOptions(takePhotoIcon: "chat"), materialOptions: MaterialOptions( actionBarColor: "#50A7F9", actionBarTitle: "Hibok", allViewTitle: "", useDetailsView: false, selectCircleStrokeColor: "#000000", ), ); if (resultList != null && resultList.length > 0) { List fileList = []; for (var i = 0; i < resultList.length; i++) { Asset photoEntity = resultList[i]; ByteData byteData = await photoEntity.getByteData(); File file = await FileCacheMgr().writeFile( 'temp-photo-${DateTime.now().millisecondsSinceEpoch}.png', byteData.buffer.asInt8List(0)); fileList.add(file); } Map data = {"type": 3, "userId": UserData().basicInfo.userId}; data['sign'] = TokenMgr().getSign(data); Response res = await HttpUtil().uploadFiles( fileList, data, 'upload/post/postfiles', 'image', isShowLoading: true); var resData = res.data; if (resData['code'] == 0 && resData['msg'] != null) { var returnList = resData['msg'].split('|'); imgUrlList.addAll(returnList); if (returnList.length != fileList.length) { showToast(I18n.of(context).hava_error_photo); } setState(() {}); } } // var photos = await PhotoPicker.pickAsset( // context: context, // themeColor: Color(0xFFF0F0F0), // maxSelected: MaxImgNum - imgUrlList.length, // textColor: Color(0xFF3F3F3F), // pickType: PickType.onlyImage); // // if (photos != null && photos.length > 0) { // List fileList = []; // for (var i = 0; i < photos.length; i++) { // AssetEntity photoEntity = photos[i]; // fileList.add(await photoEntity.file); // } // Map data = {"type": 3, "userId": UserData().basicInfo.userId}; // data['sign'] = TokenMgr().getSign(data); // Response res = await HttpUtil().uploadFiles( // fileList, data, 'upload/post/postfiles', 'image', // isShowLoading: true); // var resData = res.data; // if (resData['code'] == 0 && resData['msg'] != null) { // imgUrlList.addAll(resData['msg'].split("|")); // setState(() {}); // } // } } Widget _buildRadioButtom(str, radio, callback) { Widget left = Text( str, textScaleFactor: 1.0, style: TextStyle(fontSize: 14), ); Widget right = new Expanded( child: new Align( alignment: Alignment.centerRight, child: radio, )); return InkWell( onTap: () { callback(); }, child: Container( padding: EdgeInsets.only(left: 15), child: new Row( children: [left, right], ), ), ); } //个人详情 Widget _userDetail() { Widget tip = CustomUI.buildTopTip(15, I18n.of(context).report_reason, fontSize: 16); Widget radio1 = new Radio( value: reason.advertising.index, groupValue: _socialType, //当value和groupValue一致的时候则选中 onChanged: (T) { setState(() { _socialType = T; }); }); Widget radio2 = new Radio( value: reason.rail.index, groupValue: _socialType, //当value和groupValue一致的时候则选中 onChanged: (T) { setState(() { _socialType = T; }); }); Widget radio3 = new Radio( value: reason.breakAppointment.index, groupValue: _socialType, //当value和groupValue一致的时候则选中 onChanged: (T) { setState(() { _socialType = T; }); }); Widget radio4 = new Radio( value: reason.sex.index, groupValue: _socialType, //当value和groupValue一致的时候则选中 onChanged: (T) { setState(() { _socialType = T; }); }); Widget radio5 = new Radio( value: reason.liar.index, groupValue: _socialType, //当value和groupValue一致的时候则选中 onChanged: (T) { setState(() { _socialType = T; }); }); List basicList = [ _buildRadioButtom(I18n.of(context).advertise, radio1, () { setState(() { _socialType = reason.advertising.index; }); }), _buildDivider(), _buildRadioButtom(I18n.of(context).harassment, radio2, () { setState(() { _socialType = reason.rail.index; }); }), _buildDivider(), _buildRadioButtom(I18n.of(context).false_photo, radio3, () { setState(() { _socialType = reason.breakAppointment.index; }); }), _buildDivider(), _buildRadioButtom(I18n.of(context).erotic_vulgarity, radio4, () { setState(() { _socialType = reason.sex.index; }); }), _buildDivider(), _buildRadioButtom( widget.isMan ? I18n.of(context).he_liar : I18n.of(context).she_liar, radio5, () { setState(() { _socialType = reason.liar.index; }); }), ]; var socialCard = new Container( decoration: _getCardDecoration(), width: MediaQuery.of(context).size.width, child: new Column( children: basicList, ), ); return new Column( children: [tip, socialCard], ); } Widget _buildMoreInfo() { Widget tip = CustomUI.buildTopTip(15, I18n.of(context).provide_screenshots, fontSize: 15); Widget upButton = Container( child: InkWell( onTap: _sendPicture, child: Container( margin: EdgeInsets.only(left: 5, right: 5, top: 5, bottom: 5), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10.0), border: Border.all(color: Colors.grey)), width: 75, height: 75, child: ClipRRect( borderRadius: BorderRadius.circular(10), child: Icon( IconData( 0xe616, fontFamily: 'iconfont', ), color: Colors.grey, ), )))); List list = imgUrlList.map((f) { return _buildImg(f); }).toList(); if (list.length < MaxImgNum) { list.add(upButton); } var socialCard = new Container( width: MediaQuery.of(context).size.width, decoration: _getCardDecoration(), padding: EdgeInsets.only(bottom: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.only(left: 10, top: 10, bottom: 10), child: Wrap( crossAxisAlignment: WrapCrossAlignment.start, children: list)), _buildDivider(), Container( margin: EdgeInsets.only(top: 10, left: 14), child: fixedText(I18n.of(context).describe_details)), Container( padding: EdgeInsets.only(top: 2, left: 8, right: 14), child: TextField( keyboardAppearance: Brightness.light, style: TextStyle(textBaseline: TextBaseline.alphabetic), decoration: new InputDecoration( hintText: I18n.of(context).optional, hintStyle: TextStyle(fontSize: 14), border: InputBorder.none, ), maxLines: 5, maxLength: 200, onChanged: (str) { explain = str; }, ), ), ], ), ); return new Column( children: [tip, socialCard], ); } Widget _buildImg(f) { return Stack( children: [ InkWell( onTap: () { Navigator.of(context).push( new MaterialPageRoute( builder: (context) { return PicSwiper( id: imgUrlList.indexOf(f), pics: imgUrlList .map((f) => PicSwiperItem( f, id: imgUrlList.indexOf(f), )) .toList(), ); }, ), ); }, child: Container( height: 75, width: 75, margin: EdgeInsets.only(left: 5, right: 5, top: 5, bottom: 5), decoration: BoxDecoration(borderRadius: BorderRadius.circular(2.0)), child: ClipRRect( borderRadius: BorderRadius.circular(10), child: f == null ? Container() : CachedNetworkImage( imageUrl: f, fit: BoxFit.cover, ), ))), Positioned( right: 0, child: InkWell( onTap: () { imgUrlList.remove(f); setState(() {}); }, child: Image.asset( 'assets/images/login/delete.png', height: 20, )), ) ], ); } }