feedback_page_old.dart 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588
  1. // import 'dart:convert';
  2. // import 'dart:io';
  3. //
  4. // import 'package:cached_network_image/cached_network_image.dart';
  5. // import 'package:flutter/material.dart';
  6. // import 'package:flutter/services.dart';
  7. // import 'package:images_picker/images_picker.dart';
  8. // import 'package:provider/provider.dart';
  9. // import 'package:sport/application.dart';
  10. // import 'package:sport/bean/feed_back.dart';
  11. // import 'package:sport/bean/login.dart';
  12. // import 'package:sport/pages/my/feedback_detail_page.dart';
  13. // import 'package:sport/provider/feed_back_model.dart';
  14. // import 'package:sport/provider/user_model.dart';
  15. // import 'package:sport/router/navigator_util.dart';
  16. // import 'package:sport/services/api/inject_api.dart';
  17. // import 'package:sport/utils/DateFormat.dart';
  18. // import 'package:sport/utils/toast.dart';
  19. // import 'package:sport/widgets/appbar.dart';
  20. // import 'package:sport/widgets/button_primary.dart';
  21. // import 'package:sport/widgets/decoration.dart';
  22. // import 'package:sport/widgets/image.dart';
  23. // import 'package:sport/widgets/loading.dart';
  24. // import 'package:sport/widgets/space.dart';
  25. //
  26. // class FeedbackPage extends StatefulWidget {
  27. // @override
  28. // State<StatefulWidget> createState() => _PageState();
  29. // }
  30. //
  31. // class _PageState extends State<FeedbackPage> with InjectLoginApi, InjectApi {
  32. // FeedBackModel _feedBackModel = new FeedBackModel();
  33. // bool _isLoading = true;
  34. // FeedBackInfo? _data;
  35. // User? _user;
  36. //
  37. // var _textFieldValue = "";
  38. // late TextEditingController _controller;
  39. // late FocusNode _focusNode;
  40. // var _posting = false;
  41. // int joinTime = 0;
  42. // ValueNotifier<bool> _postable = ValueNotifier(false);
  43. //
  44. // @override
  45. // void initState() {
  46. // initData();
  47. //
  48. // _focusNode = FocusNode();
  49. // _controller = TextEditingController()
  50. // ..addListener(() {
  51. // _postable.value = _controller.value.text.isNotEmpty;
  52. // });
  53. //
  54. // _isLoading = true;
  55. // super.initState();
  56. // }
  57. //
  58. // @override
  59. // void dispose() {
  60. // super.dispose();
  61. // _focusNode.dispose();
  62. // _controller.dispose();
  63. // }
  64. //
  65. // initData() async {
  66. // _user = Provider.of<UserModel>(context, listen: false).user;
  67. // await _feedBackModel.getFeedBackTypes();
  68. // await refresh();
  69. // }
  70. //
  71. // refresh() async {
  72. // FeedBackInfo data = await _feedBackModel.getFeedBackInfo(limit: 50);
  73. // List<FeedBackInfoData> list = [];
  74. // var now = DateTime.now().millisecondsSinceEpoch ~/ 1000;
  75. // if (data.data?.isNotEmpty == true) {
  76. // list = data.data?.reversed?.toList() ?? [];
  77. // int index = 0;
  78. // if (joinTime == 0) {
  79. // joinTime = list[0].createTime;
  80. // } else {
  81. // for (var value in list) {
  82. // if (value.createTime <= joinTime) {
  83. // break;
  84. // }
  85. // index++;
  86. // }
  87. // }
  88. // list.insert(index, FeedBackInfoData(from: "-1", createTime: now));
  89. // list.insert(index, FeedBackInfoData(from: "-2", createTime: now));
  90. // } else {
  91. // list = [FeedBackInfoData(from: "-1", createTime: now), FeedBackInfoData(from: "-2", createTime: now)];
  92. // joinTime = now;
  93. // }
  94. //
  95. // List<FeedBackInfoData> fixed = [];
  96. // var t = 0;
  97. // final day = 60 * 60 * 24;
  98. // for (var e in list) {
  99. // if (t == 0) {
  100. // t = e.createTime;
  101. // }
  102. // print("$t ${e.createTime} ${day} ${e.createTime + day} ${t > e.createTime + day}");
  103. // if (t > e.createTime + day) {
  104. // fixed.add(FeedBackInfoData(from: "-3", createTime: t));
  105. // }
  106. // fixed.add(e);
  107. // t = e.createTime;
  108. // }
  109. // if (fixed.length > 2) {
  110. // fixed.add(FeedBackInfoData(from: "-3", createTime: fixed[fixed.length - 1].createTime));
  111. // }
  112. //
  113. // data.data = fixed;
  114. // setState(() {
  115. // _data = data;
  116. // _isLoading = false;
  117. // });
  118. // }
  119. //
  120. // @override
  121. // Widget build(BuildContext context) {
  122. // return Scaffold(
  123. // appBar: buildAppBar(context, title: "用户反馈"),
  124. // body: Column(
  125. // children: <Widget>[
  126. // Expanded(
  127. // child: ChangeNotifierProvider<FeedBackModel>(
  128. // create: (context) => _feedBackModel,
  129. // child: Consumer<FeedBackModel>(
  130. // builder: (context, model, child) {
  131. // return _isLoading
  132. // ? RequestLoadingWidget()
  133. // : CustomScrollView(reverse: (_data?.data?.length ?? 0) > 2, slivers: [
  134. // SliverList(
  135. // delegate: SliverChildListDelegate(
  136. // (_data?.data ?? [])
  137. // .map((e) => e.from == "-3"
  138. // ? Center(
  139. // child: Padding(
  140. // padding: EdgeInsets.symmetric(vertical: 8.0),
  141. // child: Text(
  142. // "${DateFormat.formatTime(e.createTime)}",
  143. // style: Theme.of(context).textTheme.bodyText1,
  144. // )),
  145. // )
  146. // : e.from == "-1"
  147. // ? Padding(
  148. // padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 12.0),
  149. // child: Row(
  150. // crossAxisAlignment: CrossAxisAlignment.start,
  151. // children: <Widget>[
  152. // CircleAvatar(
  153. // backgroundImage: CachedNetworkImageProvider(
  154. // "https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=2661558467,1288211245&fm=26&gp=0.jpg"),
  155. // radius: 20,
  156. // ),
  157. // Space(
  158. // width: 12,
  159. // ),
  160. // CustomPaint(
  161. // painter: BubblePainter(),
  162. // child: Padding(
  163. // padding: const EdgeInsets.fromLTRB(20.0, 8.0, 12, 8),
  164. // child: Container(
  165. // child: Text(
  166. // "很高兴认识你",
  167. // style: Theme.of(context).textTheme.subtitle1!.copyWith(fontSize: 16),
  168. // ),
  169. // ),
  170. // ),
  171. // )
  172. // ],
  173. // ),
  174. // )
  175. // : e.from == "-2"
  176. // ? Padding(
  177. // padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 12.0),
  178. // child: Row(
  179. // crossAxisAlignment: CrossAxisAlignment.start,
  180. // children: <Widget>[
  181. // CircleAvatar(
  182. // backgroundImage: CachedNetworkImageProvider(
  183. // "https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=2661558467,1288211245&fm=26&gp=0.jpg"),
  184. // radius: 20,
  185. // ),
  186. // Space(
  187. // width: 12,
  188. // ),
  189. // CustomPaint(
  190. // painter: BubblePainter(),
  191. // child: Padding(
  192. // padding: const EdgeInsets.fromLTRB(20.0, 8.0, 12, 8),
  193. // child: Container(
  194. // child: Column(
  195. // crossAxisAlignment: CrossAxisAlignment.start,
  196. // children: <Widget>[
  197. // Text(
  198. // "常见问题",
  199. // style: Theme.of(context).textTheme.subtitle1!.copyWith(fontSize: 16),
  200. // ),
  201. // Column(
  202. // crossAxisAlignment: CrossAxisAlignment.start,
  203. // children: (model.data?.data ?? [])
  204. // .map((e) => InkWell(
  205. // onTap: () {
  206. // NavigatorUtil.goPage(context, (context) => FeedbackDetailPage(e));
  207. // // NavigatorUtil.go(context, "${Routes.feedbackDetail}?data=${Uri.encodeComponent(json.encode(e))}");
  208. // },
  209. // child: Padding(
  210. // padding: EdgeInsets.symmetric(vertical: 5.0),
  211. // child: Text("${(model.data?.data?.indexOf(e)??0) + 1}.${e.groupName}",
  212. // style: Theme.of(context)
  213. // .textTheme
  214. // .subtitle1!
  215. // .copyWith(color: Color(0xff666666), fontSize: 16)),
  216. // )))
  217. // .toList(),
  218. // ),
  219. // ],
  220. // )),
  221. // ),
  222. // ),
  223. // ],
  224. // ),
  225. // )
  226. // : Padding(
  227. // padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 12.0),
  228. // child: Row(
  229. // crossAxisAlignment: CrossAxisAlignment.start,
  230. // mainAxisAlignment: e.from == "user" ? MainAxisAlignment.end : MainAxisAlignment.start,
  231. // children: e.from == "user"
  232. // ? <Widget>[
  233. // CustomPaint(
  234. // painter: BubblePainterRight(),
  235. // child: ConstrainedBox(
  236. // constraints: BoxConstraints(maxWidth: MediaQuery.of(context).size.width * 0.6),
  237. // child: Container(
  238. // padding: EdgeInsets.fromLTRB(12, 6, 20, 8),
  239. // child: Column(
  240. // children: <Widget>[
  241. // Text(
  242. // "${e.content}",
  243. // style: Theme.of(context)
  244. // .textTheme
  245. // .subtitle1!
  246. // .copyWith(fontSize: 16, color: Color(0xff333333)),
  247. // ),
  248. // if (e.images?.isNotEmpty == true)
  249. // GridView.count(
  250. // physics: new NeverScrollableScrollPhysics(),
  251. // shrinkWrap: true,
  252. // padding: EdgeInsets.zero,
  253. // crossAxisSpacing: 10.0,
  254. // crossAxisCount: e.images?.length ?? 0,
  255. // children: (e.images ?? [])
  256. // .asMap()
  257. // .keys
  258. // .map((i) => CachedNetworkImage(
  259. // imageUrl: e.images![i],
  260. // fit: BoxFit.cover,
  261. // ))
  262. // .toList())
  263. // ],
  264. // crossAxisAlignment: CrossAxisAlignment.start,
  265. // ),
  266. // ),
  267. // )),
  268. // Space(
  269. // width: 12,
  270. // ),
  271. // CircleAvatar(
  272. // backgroundImage: userAvatarProvider(_user?.avatar),
  273. // radius: 20,
  274. // ),
  275. // ]
  276. // : <Widget>[
  277. // CircleAvatar(
  278. // backgroundImage: CachedNetworkImageProvider(
  279. // "https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=2661558467,1288211245&fm=26&gp=0.jpg"),
  280. // radius: 20,
  281. // ),
  282. // Space(
  283. // width: 12,
  284. // ),
  285. // CustomPaint(
  286. // painter: BubblePainter(),
  287. // child: ConstrainedBox(
  288. // constraints: BoxConstraints(maxWidth: MediaQuery.of(context).size.width * 0.6),
  289. // child: Container(
  290. // padding: EdgeInsets.fromLTRB(12, 6, 20, 8),
  291. // child: Text(
  292. // "${e.content}",
  293. // style: Theme.of(context).textTheme.subtitle1!.copyWith(fontSize: 16),
  294. // ),
  295. // ),
  296. // )),
  297. // ],
  298. // ),
  299. // ))
  300. // .toList(),
  301. // ),
  302. // )
  303. // ]);
  304. // },
  305. // ),
  306. // ),
  307. // ),
  308. // ConstrainedBox(
  309. // constraints: BoxConstraints(maxHeight: 150, minHeight: 50),
  310. // child: Container(
  311. // decoration: shadowTop(),
  312. // child: Row(
  313. // children: <Widget>[
  314. // GestureDetector(
  315. // onTap: () {
  316. // _postImage();
  317. // },
  318. // child: Padding(
  319. // padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 12.0),
  320. // child: Image.asset("lib/assets/img/bbs_icon_picture.png"),
  321. // ),
  322. // ),
  323. // Expanded(
  324. // child: Container(
  325. // child: TextField(
  326. // controller: _controller,
  327. // focusNode: _focusNode,
  328. // keyboardType: TextInputType.multiline,
  329. // strutStyle: StrutStyle(forceStrutHeight: true, height: 1.4),
  330. // minLines: 1,
  331. // maxLines: 3,
  332. // maxLength: 200,
  333. // style: TextStyle(fontSize: 16.0),
  334. // onChanged: (value) {
  335. // setState(() {
  336. // _textFieldValue = value;
  337. // });
  338. // },
  339. // decoration: InputDecoration(
  340. // counterText: "",
  341. // hintText: "提交你的反馈...",
  342. // contentPadding: EdgeInsets.symmetric(vertical: 16.0),
  343. // border: InputBorder.none,
  344. // hintStyle: TextStyle(color: Color(0xff999999))),
  345. // ),
  346. // ),
  347. // ),
  348. // Padding(
  349. // padding: const EdgeInsets.symmetric(horizontal: 12.0),
  350. // child: _posting
  351. // ? SizedBox(
  352. // height: 22,
  353. // width: 22,
  354. // child: CircularProgressIndicator(),
  355. // )
  356. // : ValueListenableBuilder(
  357. // valueListenable: _postable,
  358. // builder: (_, able, __) => PrimaryButton(
  359. // content: "提交",
  360. // width: 80,
  361. // height: 35,
  362. // callback: () async {
  363. // setState(() {
  364. // _posting = true;
  365. // });
  366. // _controller.clear();
  367. //
  368. // await _postFeedBackpostFeedBack(_textFieldValue);
  369. // // ToastUtil.show("提交成功");
  370. //
  371. // setState(() {
  372. // _textFieldValue = '';
  373. // _posting = false;
  374. // });
  375. // refresh();
  376. // },
  377. // shadow: able == true,
  378. // buttonColor: able == false ? Color(0xffFFC400).withOpacity(0.3) : null,
  379. // )),
  380. // )
  381. // ],
  382. // ),
  383. // ),
  384. // )
  385. // ],
  386. // ));
  387. // }
  388. //
  389. // _postImage() async {
  390. // var resultList = await ImagesPicker.pick(quality: 0.8, maxSize: 500, count: 3);
  391. //
  392. // if (resultList == null || resultList.isEmpty) return;
  393. //
  394. // showDialog(
  395. // context: context,
  396. // barrierDismissible: false,
  397. // builder: (context) => SimpleDialog(
  398. // children: <Widget>[PostAction(_textFieldValue, resultList)],
  399. // )).then((value) {
  400. // ToastUtil.show("提交成功");
  401. // refresh();
  402. // }).catchError((e) {});
  403. // }
  404. //
  405. // _postFeedBackpostFeedBack(String content, {int typeId = 0}) async {
  406. // typeId == null ? typeId = 0 : typeId = typeId;
  407. // await api.postFeedback(typeId, content, extra: await Application.getDeviceInfo());
  408. // }
  409. // }
  410. //
  411. // class PostAction extends StatefulWidget {
  412. // final String content;
  413. // final List<Media> imageList;
  414. //
  415. // const PostAction(this.content, this.imageList);
  416. //
  417. // @override
  418. // State<StatefulWidget> createState() => PostActionState();
  419. // }
  420. //
  421. // class PostActionState extends State<PostAction> with InjectApi {
  422. // final Map<Media, String> upload = {};
  423. // late ValueNotifier<String> _msg;
  424. //
  425. // @override
  426. // void initState() {
  427. // super.initState();
  428. // _msg = ValueNotifier<String>("请稍候...");
  429. // WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
  430. // post();
  431. // });
  432. // }
  433. //
  434. // @override
  435. // void dispose() {
  436. // _msg.dispose();
  437. // super.dispose();
  438. // }
  439. //
  440. // void post() async {
  441. // List<Media> imageList = widget.imageList;
  442. // if (imageList != null && imageList.isNotEmpty) {
  443. // for (var i = 0; i < imageList.length; i++) {
  444. // Media asset = imageList[i];
  445. // if (upload.containsKey(asset)) continue;
  446. // File file = File(asset.path);
  447. // _msg.value = "上传图片(${i + 1}/${imageList.length})...";
  448. // var resp = await api.mediaUp4Feedback(file);
  449. // var image = resp.data;
  450. // if(image != null) {
  451. // file.delete();
  452. // upload[asset] = image;
  453. // }
  454. // // await Future.delayed(Duration(seconds: 3));
  455. // }
  456. // }
  457. //
  458. // _msg.value = "发布中...";
  459. // // await Future.delayed(Duration(seconds: 3));
  460. // var data = await api.postFeedback(0, '图片', images: json.encode(upload.values.toList()), extra: await Application.getDeviceInfo());
  461. // print(data);
  462. // if (data.code == 0) {
  463. // Navigator.of(context).pop(true);
  464. // } else {
  465. // Navigator.of(context).pop(false);
  466. // }
  467. // }
  468. //
  469. // @override
  470. // Widget build(BuildContext context) {
  471. // return Padding(
  472. // padding: const EdgeInsets.symmetric(vertical: 16),
  473. // child: Column(
  474. // children: <Widget>[
  475. // CircularProgressIndicator(),
  476. // Padding(
  477. // padding: const EdgeInsets.only(top: 15),
  478. // child: ValueListenableBuilder(valueListenable: _msg, builder: (BuildContext context, String value, Widget? child) => Text(value)),
  479. // )
  480. // ],
  481. // ),
  482. // );
  483. // }
  484. // }
  485. //
  486. // //class _BubblePainter extends CustomPainter {
  487. // // final circular = Radius.circular(10);
  488. // // final Paint _paint = Paint()..color = Colors.white;
  489. // // final double _bubbleWidth = 10;
  490. // //
  491. // // @override
  492. // // void paint(Canvas canvas, Size size) {
  493. // //// Path path = Path()..moveTo(size.width, size.height / 2)..quadraticBezierTo(size.width / 3*2, size.height / 2 + 50, 0, size.height / 2)
  494. // //// ..quadraticBezierTo(size.width / 3, size.height,size.width,size.height)..close();
  495. // // Path path = Path()
  496. // // ..moveTo(_bubbleWidth + 1, _bubbleWidth)
  497. // // ..quadraticBezierTo(_bubbleWidth / 3 * 2, _bubbleWidth + 4, 0, _bubbleWidth)
  498. // // ..quadraticBezierTo(_bubbleWidth / 3, _bubbleWidth + _bubbleWidth / 2, _bubbleWidth + 1, _bubbleWidth * 2)
  499. // // ..close();
  500. // // canvas.drawPath(path, _paint);
  501. // // canvas.drawRRect(RRect.fromLTRBR(_bubbleWidth, 0, size.width, size.height, circular), _paint);
  502. // // }
  503. // //
  504. // // @override
  505. // // bool shouldRepaint(CustomPainter oldDelegate) {
  506. // // return oldDelegate != this;
  507. // // }
  508. // //}
  509. // //
  510. // //class _BubblePainterRight extends CustomPainter {
  511. // // final circular = Radius.circular(10);
  512. // // final Paint _paint = Paint()..color = Color(0xffFFC400);
  513. // // final double _bubbleWidth = 10;
  514. // //
  515. // // @override
  516. // // void paint(Canvas canvas, Size size) {
  517. // //// Path path = Path()..moveTo(size.width, size.height / 2)..quadraticBezierTo(size.width / 3*2, size.height / 2 + 50, 0, size.height / 2)
  518. // //// ..quadraticBezierTo(size.width / 3, size.height,size.width,size.height)..close();
  519. // // double left = size.width - _bubbleWidth;
  520. // // Path path = Path()
  521. // // ..moveTo(left, _bubbleWidth)
  522. // // ..quadraticBezierTo(left + _bubbleWidth / 3 * 2, _bubbleWidth + 4, size.width, _bubbleWidth)
  523. // // ..quadraticBezierTo(left + _bubbleWidth / 3, _bubbleWidth + _bubbleWidth / 2, left, _bubbleWidth * 2)
  524. // // ..close();
  525. // // canvas.drawPath(path, _paint);
  526. // // canvas.drawRRect(RRect.fromLTRBR(0, 0, size.width - _bubbleWidth, size.height, circular), _paint);
  527. // // }
  528. // //
  529. // // @override
  530. // // bool shouldRepaint(CustomPainter oldDelegate) {
  531. // // return oldDelegate != this;
  532. // // }
  533. // //}
  534. //
  535. // class BubblePainter extends CustomPainter {
  536. // final circular = Radius.circular(10);
  537. // final Paint _paint = Paint()
  538. // ..color = Colors.white
  539. // ..strokeJoin = StrokeJoin.round;
  540. // final double _bubbleWidth = 6;
  541. //
  542. // @override
  543. // void paint(Canvas canvas, Size size) {
  544. // // Path path = Path()..moveTo(size.width, size.height / 2)..quadraticBezierTo(size.width / 3*2, size.height / 2 + 50, 0, size.height / 2)
  545. // // ..quadraticBezierTo(size.width / 3, size.height,size.width,size.height)..close();
  546. // Path path = Path()
  547. // ..moveTo(_bubbleWidth + 1, 10)
  548. // ..lineTo(0, 15)
  549. // ..lineTo(0, 16)
  550. // ..lineTo(_bubbleWidth + 1, 21)
  551. // ..close();
  552. // canvas.drawPath(path, _paint);
  553. // canvas.drawRRect(RRect.fromLTRBR(_bubbleWidth, 0, size.width, size.height, circular), _paint);
  554. // }
  555. //
  556. // @override
  557. // bool shouldRepaint(CustomPainter oldDelegate) {
  558. // return oldDelegate != this;
  559. // }
  560. // }
  561. //
  562. // class BubblePainterRight extends CustomPainter {
  563. // final circular = Radius.circular(10);
  564. // final Paint _paint = Paint()
  565. // ..color = Color(0xffffe400).withOpacity(0.7)
  566. // ..strokeJoin = StrokeJoin.round;
  567. // final double _bubbleWidth = 6;
  568. //
  569. // @override
  570. // void paint(Canvas canvas, Size size) {
  571. // // Path path = Path()..moveTo(size.width, size.height / 2)..quadraticBezierTo(size.width / 3*2, size.height / 2 + 50, 0, size.height / 2)
  572. // // ..quadraticBezierTo(size.width / 3, size.height,size.width,size.height)..close();
  573. // double left = size.width - _bubbleWidth - 1;
  574. // Path path = Path()
  575. // ..moveTo(left, 10)
  576. // ..lineTo(size.width, 15)
  577. // ..lineTo(size.width, 16)
  578. // ..lineTo(left, 21)
  579. // ..close();
  580. // canvas.drawPath(path, _paint);
  581. // canvas.drawRRect(RRect.fromLTRBR(0, 0, size.width - _bubbleWidth, size.height, circular), _paint);
  582. // }
  583. //
  584. // @override
  585. // bool shouldRepaint(CustomPainter oldDelegate) {
  586. // return oldDelegate != this;
  587. // }
  588. // }