123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498 |
- // import 'dart:async';
- // import 'dart:convert';
- // import 'dart:io';
- //
- // import 'package:flutter/cupertino.dart';
- // import 'package:flutter/material.dart';
- // import 'package:flutter/services.dart';
- // import 'package:images_picker/images_picker.dart';
- // import 'package:provider/provider.dart';
- // import 'package:sport/bean/message.dart';
- // import 'package:sport/provider/message_model.dart';
- // import 'package:sport/services/api/inject_api.dart';
- // import 'package:sport/utils/callback.dart';
- // import 'package:sport/utils/toast.dart';
- // import 'package:sport/widgets/button_primary.dart';
- // import 'package:sport/widgets/decoration.dart';
- // import 'package:sport/widgets/space.dart';
- //
- // import '../application.dart';
- // import 'dialog/request_dialog.dart';
- //
- // class MenuBar extends StatefulWidget {
- // final String? inputField;
- // final Function? closeMenuCallBack;
- // final Widget messageList;
- // final Function? scrollToBottom;
- // final MenuIdentity menuIdentity;
- // final Function? sendCallBack;
- // final GlobalKey? globalkey;
- // final IntCallback? keyboardCallBack;
- //
- // MenuBar(
- // this.messageList, {
- // required this.menuIdentity,
- // this.inputField,
- // this.closeMenuCallBack,
- // this.scrollToBottom,
- // this.sendCallBack,
- // this.globalkey,
- // this.keyboardCallBack,
- // });
- //
- // @override
- // State<StatefulWidget> createState() {
- // return _MenuBarState();
- // }
- // }
- //
- // class _MenuBarState extends State<MenuBar> with WidgetsBindingObserver, InjectApi {
- // GlobalKey _myKey = new GlobalKey(); // 用来定位Message位置
- //
- // String _textFieldValue = ""; // TextField的文本
- //
- // // TextField的 controller
- // TextEditingController? _controller;
- //
- // FocusNode _focusNode = new FocusNode(); // TextField 的 focus
- //
- // ValueNotifier<bool> _postable = ValueNotifier(false);
- //
- // double keyBoardHeight = 270.0; // 初始化下面menu的高度 后续会动态调整后 优化
- //
- // bool isFirst = true; // flag 优化menu高度的操作
- //
- // String? emojiJson; // 读取的JSON
- //
- // int isShowMenuBottomIndex = 0; // 用数字去优化if else 的判断
- //
- // double? height;
- //
- // Timer? _timer;
- //
- // bool showInput = true;
- //
- // @override
- // void didUpdateWidget(MenuBar oldWidget) {
- // super.didUpdateWidget(oldWidget);
- // widget.scrollToBottom?.call();
- // }
- //
- // void initState() {
- // super.initState();
- //
- // initEmoji();
- //
- // _controller = TextEditingController()
- // ..addListener(() {
- // _postable.value = _controller?.value.text.isNotEmpty == true;
- // });
- // _focusNode.addListener(() {
- // widget.keyboardCallBack?.call(isShowMenuBottomIndex);
- // });
- // }
- //
- // // 直接进来就请求了 不要 搞这些骚的....
- // void initEmoji() async {
- // String json = await DefaultAssetBundle.of(context).loadString("lib/assets/json/emoji_list.json");
- // setState(() {
- // emojiJson = json;
- // });
- // }
- //
- // //页面销毁
- // @override
- // void dispose() {
- // super.dispose();
- // //释放
- // _focusNode.dispose();
- // _timer?.cancel();
- // _postable.dispose();
- // _controller?.dispose();
- // }
- //
- // // 这里 插库 + 渲染更新...
- // Future add(MessageInstance? message) async {
- // if (message == null) return;
- //
- // GetIt.I<MessageModel>().add(context, [message]);
- // }
- //
- // _postFeedBackpostFeedBack(String content, {int typeId = 0}) async {
- // // typeId == null ? typeId = 0 : typeId = typeId;
- // // await api.postFeedback(typeId, content, extra: await Application.getDeviceInfo());
- // }
- //
- // _uploadImage(List<File> files) async {
- // if (widget.menuIdentity.menuScene == "chat") {
- // await request(context, () async {
- // for (var file in files) {
- // String path = file.path;
- // var data = (await api.postChatUpload(file)).data;
- // Image image = Image.file(File.fromUri(Uri.parse(file.path)));
- // image.image.resolve(ImageConfiguration()).addListener(ImageStreamListener((ImageInfo image, bool synchronousCall) {
- // // print("$data----------------------${image.image.width} - ${image.image.height}------");
- // api
- // .postChatSend(widget.menuIdentity.userId, "image", '{ "url":"${data['url']}", "w":${image.image.width}, "h":${image.image.height} }')
- // .then((value) => add(value.data));
- // file.delete();
- // }));
- // }
- // });
- // }
- // }
- //
- // Widget extMenuItem(
- // String text,
- // String url,
- // int index,
- // ) {
- // String error;
- // void getPicture() async {
- // try {
- // var resultList = await ImagesPicker.pick(quality: 0.8, maxSize: 1024, count: 9);
- //
- // if (resultList != null) {
- // List<File> files = [];
- // for (var i = 0; i < resultList.length; i++) {
- // Media asset = resultList[i];
- // File file = File(asset.path);
- // files.add(file);
- // }
- // _uploadImage(files);
- // }
- // } on Exception catch (e) {
- // error = e.toString();
- // }
- // }
- //
- // void getPhoto() async {
- // try {
- // // 拍完直接发...
- // final pickedFile = await ImagesPicker.openCamera(
- // pickType: PickType.image,
- // );
- //
- // if (pickedFile == null || pickedFile.isEmpty) return;
- // _uploadImage([File(pickedFile[0].path)]);
- // } on Exception catch (e) {
- // error = e.toString();
- // }
- // }
- //
- // List<Function> menuOperation = [getPicture, getPhoto];
- //
- // return InkWell(
- // child: Column(
- // crossAxisAlignment: CrossAxisAlignment.center,
- // children: <Widget>[
- // Container(
- // padding: EdgeInsets.fromLTRB(14.0, 16.0, 14.0, 14.0),
- // child: Image.asset("lib/assets/img/$url.png"),
- // decoration: BoxDecoration(
- // borderRadius: BorderRadius.circular(10.0),
- // color: Color(0xfff1f1f1),
- // ),
- // ),
- // SizedBox(
- // height: 5.0,
- // ),
- // Text("$text")
- // ],
- // ),
- // onTap: () {
- // menuOperation[index]();
- // },
- // );
- // }
- //
- // Widget _emoJiList() {
- // if (emojiJson != null && emojiJson?.length != 0) {
- // List<dynamic> data = json.decode(emojiJson!);
- // return Container(
- // height: keyBoardHeight,
- // padding: EdgeInsets.only(left: 5, top: 5, right: 5, bottom: 5),
- // decoration: BoxDecoration(color: Colors.white, border: Border(top: BorderSide(width: 1.0, color: Color(0xFFDCDCDC)))),
- // child: GridView.custom(
- // padding: EdgeInsets.all(3),
- // shrinkWrap: true,
- // gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
- // crossAxisCount: 6,
- // mainAxisSpacing: 0.5,
- // crossAxisSpacing: 6.0,
- // ),
- // childrenDelegate: SliverChildBuilderDelegate(
- // (context, index) {
- // return GestureDetector(
- // onTap: () {
- // String intPutString = (_controller?.text ?? "") + String.fromCharCode(data[index]["unicode"]);
- // var content = intPutString;
- // _controller?.value = TextEditingValue(
- // // 设置内容
- // text: content,
- // // 保持光标在最后
- // selection: TextSelection.fromPosition(TextPosition(affinity: TextAffinity.downstream, offset: content.length)));
- // // 主要是 onchange 没有办法 加上 表情 ...
- // setState(() {});
- // },
- // child: Center(
- // child: Text(
- // String.fromCharCode(data[index]["unicode"]),
- // style: TextStyle(fontSize: 33),
- // ),
- // ),
- // );
- // },
- // childCount: data.length,
- // ),
- // ),
- // );
- // }
- // return Container();
- // }
- //
- // Widget menuBottom() {
- // // 这里的软键盘动画还是有点问题....
- // List<Widget> list = [
- // Container(),
- // SizedBox(
- // height: MediaQuery.of(context).viewInsets.bottom,
- // ),
- // Container(
- // height: keyBoardHeight,
- // padding: EdgeInsets.only(left: 24.0, right: 24.0),
- // decoration: BoxDecoration(color: Colors.white, border: Border(top: BorderSide(width: 1.0, color: Color(0xFFDCDCDC)))),
- // child: GridView(
- // shrinkWrap: true,
- // padding: EdgeInsets.only(top: 24.0),
- // physics: NeverScrollableScrollPhysics(),
- // gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
- // crossAxisCount: 4, //横轴三个子widget
- // ),
- // children: <Widget>[
- // extMenuItem("图片", "bbs_icon_picture", 0),
- // extMenuItem("拍照", "bbs_icon_photo", 1),
- // ])),
- // _emoJiList(),
- // ];
- // return list[isShowMenuBottomIndex];
- // }
- //
- // Widget build(BuildContext context) {
- // // 优化 输入键盘高度 跟 菜单栏高度的操作
- // if (isFirst && MediaQuery.of(context).viewInsets.bottom != 0.0) {
- // setState(() {
- // keyBoardHeight = MediaQuery.of(context).viewInsets.bottom;
- // isFirst = false;
- // });
- // }
- //
- // return Column(
- // children: <Widget>[
- // Expanded(
- // child: GestureDetector(
- // behavior: HitTestBehavior.translucent,
- // onTap: () {
- // setState(() {
- // isShowMenuBottomIndex = 0;
- // });
- // _focusNode.unfocus();
- // },
- // child: Column(
- // children: <Widget>[
- // Flexible(
- // child: widget.messageList),
- // ],
- // ),
- // ),
- // ),
- // if (showInput)
- // // Column(
- // // children: <Widget>[
- // //// Container(
- // //// color: Colors.white,
- // //// padding: EdgeInsets.only(top: 10.0,left: 10.0,right: 10.0,bottom: 10.0),
- // //// child:
- // //// ),
- // // ,
- // // ],
- // // ),
- // Container(
- // padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 12.0),
- // decoration: shadowTop(),
- // child: Row(
- // children: <Widget>[
- // GestureDetector(
- // onTap: () async {
- // if (_focusNode.hasFocus) {
- // await SystemChannels.textInput.invokeMethod('TextInput.hide');
- // widget.keyboardCallBack?.call(isShowMenuBottomIndex);
- // }
- // setState(() {
- // isShowMenuBottomIndex = 2;
- // });
- // },
- // child: Padding(
- // // padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 12.0),
- // child: Image.asset("lib/assets/img/bbs_icon_addmore.png"),
- // padding: EdgeInsets.only(right: 12.0),
- // ),
- // ),
- // GestureDetector(
- // onTap: () {
- // FocusScope.of(context).requestFocus(_focusNode);
- // if (_focusNode.hasFocus) {
- // SystemChannels.textInput.invokeMethod('TextInput.hide');
- // widget.keyboardCallBack?.call(isShowMenuBottomIndex);
- // }
- // setState(() {
- // isShowMenuBottomIndex = 3;
- // });
- // },
- // child: Padding(
- // // padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 12.0),
- // child: Image.asset("lib/assets/img/bbs_icon_expression.png"),
- // padding: EdgeInsets.only(right: 12.0),
- // ),
- // ),
- // Expanded(
- // child: CupertinoTextField(
- // cursorColor: const Color(0xffFFC400),
- // controller: _controller,
- // focusNode: _focusNode,
- // keyboardType: TextInputType.multiline,
- // style: TextStyle(
- // fontSize: 16.0,
- // ),
- // strutStyle: StrutStyle(forceStrutHeight: true, height: 1.4),
- // minLines: 1,
- // maxLines: 3,
- // // maxLength: 200,
- // onChanged: (value) {
- // // setState(() {
- // // // _textFieldValue = value;
- // // });
- // },
- // onTap: () {
- // setState(() {
- // isShowMenuBottomIndex = 1;
- // });
- // widget.scrollToBottom?.call();
- // },
- // decoration: BoxDecoration(shape: BoxShape.rectangle, borderRadius: BorderRadius.all(Radius.circular(10)), color: Color(0xfff1f1f1)),
- // ),
- // ),
- // Space(
- // width: 5.0,
- // ),
- // ValueListenableBuilder(
- // valueListenable: _postable,
- // builder: (_, able, __) => PrimaryButton(
- // width: 75,
- // height: 35.0,
- // content: "发送",
- // callback: () async {
- // if (_controller?.text.isEmpty == true) {
- // // ToastUtil.show("请输入正确的内容");
- // return;
- // }
- // var content = _controller?.text;
- // _controller?.clear();
- //
- // if (widget.menuIdentity.menuScene == "chat") {
- // MessageInstance? message = (await api.postChatSend(widget.menuIdentity.userId, "text", '{"text":"$content"}')).data;
- // if (message != null) await add(message); // await 是等待的标志 我等待完 在做后面的init 的事?
- // }
- // // if (widget.menuIdentity.menuScene == "feedback") {
- // // await _postFeedBackpostFeedBack(_textFieldValue);
- // // }
- //
- // // 这里可能传不了 callback 所有需要的值都在menu bar里面 只能通过传 不同的 场景 进行 不同的操作
- // },
- // shadow: able == true,
- // // buttonColor: able == false ? Color(0xffd2d2d2) : null,
- // buttonColor: able == false ? Color(0xffFFC400).withOpacity(0.3) : null,
- // )),
- // ],
- // )),
- // // 底部的骚操作
- // menuBottom(),
- // ],
- // );
- // }
- // }
- //
- // // // 只是用来封装 scrollToBottom
- // class GetMenuController {
- // ScrollController scrollMenuController = new ScrollController();
- //
- // // 暂时不用 这个 scrollToBottom ...
- // void scrollToBottom(BuildContext context, GlobalKey key, bool first) {
- // scrollMenuController.addListener(() {
- // print("[offSet:]${scrollMenuController.offset}----------------------");
- // });
- //
- // // 页面一屏的高度
- // double pageHeight = MediaQuery.of(context).size.height;
- //
- // // 头部的高度...
- // double appBarAndHeight = MediaQuery.of(context).padding.top + 56;
- //
- // // 尾部的高度...
- // double bottomHeight = 160;
- //
- // // scrollView 的 高度 ...
- // double scrollHeight = key.currentContext?.size?.height ?? 0;
- //
- // print("[scrollHeight]:$scrollHeight----------------------------");
- //
- // double position = scrollMenuController.position.maxScrollExtent;
- //
- // double currentOffset = scrollMenuController.offset;
- //
- // double getScrollTop(bool first) {
- // if (first) {
- // return scrollHeight;
- // } else {
- // // 不需要滚动的状态... 当前 所处的位置 需不需要 加上 bottomHeight...
- // if (currentOffset < bottomHeight) {
- // return position + appBarAndHeight + bottomHeight;
- // } else {
- // return position + appBarAndHeight;
- // }
- // }
- // }
- //
- // if (scrollMenuController.hasClients) {
- // Future.delayed(Duration(milliseconds: 30), () {
- // scrollMenuController.jumpTo(getScrollTop(first));
- // });
- // }
- // }
- //
- // // 后续修改为用这个...
- // void scroll() {
- // // SchedulerBinding.instance?.addPostFrameCallback((_) {
- // ////here the sublist is already build
- // // scrollMenuController
- // // .jumpTo(scrollMenuController.position.maxScrollExtent);
- // // print(
- // // "${scrollMenuController.position.minScrollExtent} - ${scrollMenuController.position.maxScrollExtent}");
- // // });
- // }
- // }
- //
- // // 自己内部传的 bean 用来鉴别 是什么 场景使用的 menuBar
- // class MenuIdentity {
- // String menuScene; // 当前的MenuBar 所属的场景在哪 比如 聊天 chat / 社区 social / 反馈 feedBack 等
- // int userId; // Chat的时候需要的userId
- //
- // MenuIdentity({required this.menuScene, required this.userId});
- //
- // Map<String, dynamic> toJson() {
- // final Map<String, dynamic> data = new Map<String, dynamic>();
- // data['menuScene'] = this.menuScene;
- // data['userId'] = this.userId;
- // return data;
- // }
- // }
|