import 'dart:async'; import 'dart:convert'; import 'package:assets_audio_player/assets_audio_player.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:trackoffical_app/generated/assets.dart'; import 'package:trackoffical_app/logger.dart'; import 'package:trackoffical_app/service/app.dart'; import 'package:trackoffical_app/view/ingame/dialog/dialog_base.dart'; import 'package:trackoffical_app/view/ingame/dialog/dialog_check_text.dart'; import 'package:trackoffical_app/widget/app_net_image.dart'; import '../../../model/cp_extra_info_choice_question.dart'; import '../../../model/m_control_point.dart'; import '../../../screen.dart'; import '../../../styles/theme.dart'; Future showDialogCheckRich( MControlPoint point, Duration? offAfter, ) async { while(Get.isOverlaysOpen){ Get.back(); } Get.dialog(DialogCheckRichSeq( point, offAfter, )); } class DialogCheckRichSeq extends StatefulWidget{ const DialogCheckRichSeq( this.point, this.offAfter, {super.key} ); final MControlPoint point; final Duration? offAfter; @override State createState() { return DialogCheckRichSeqState(); } } class DialogCheckRichSeqState extends State{ var seq = 0; var beanCount=0; @override void initState() { super.initState(); } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { final isShowOriginality = App.to.userProfile.gameSettingsShowOriginality.value; if(seq==0){ return DialogCheckText( text: '打点成功', color: const Color(0xffff870d), beanCount: 1, autoPlayAfter: 1.seconds, closeAfterPlay: !isShowOriginality, onStop: (){ if(mounted){ if (widget.point.extraInfo != null && isShowOriginality) { setState(() { seq = 1; }); } } }, ); } if(seq==1){ return DialogCheckRich( point: widget.point, offAfter: widget.offAfter, onBeanCount: (c) { beanCount = c; }, onStop: (){ if(mounted){ setState(() { seq = 2; }); } }, ); } if(seq==2){ return DialogCheckText( text: '', color: const Color(0xffff870d), beanCount: beanCount, autoPlayAfter: 1.seconds, ); } throw UnimplementedError(); } } class DialogCheckRich extends DialogBaseOffCount { const DialogCheckRich({ super.key, required this.point, required super.offAfter, required this.onBeanCount, required this.onStop }) : super(child: const SizedBox()); final Function(int c) onBeanCount; final MControlPoint point; final VoidCallback onStop; @override State createState() { return DialogCheckRichState(); } } class DialogCheckRichState extends DialogBaseOffCountState { int? selectedIndex; var isFinish = false; final _audioPlayer = AssetsAudioPlayer.newPlayer(); var isAnswerOk = false; @override void onStop() { widget.onStop(); } void _setFinish() { setState(() { isFinish = true; }); final src = isAnswerOk ? Assets.soundAnswerOk : Assets.soundAnswerFail; _audioPlayer.open( Audio(src), autoStart: true, showNotification: false, ); 1.seconds.delay().then((value) { if (isActive && Get.isOverlaysOpen) { // Get.back(); widget.onStop(); } }); } @override void dispose() { _audioPlayer.dispose(); super.dispose(); } @override Widget build(BuildContext context) { final style = (context.textTheme.titleLarge ?? const TextStyle()) .copyWith(color: const Color(0xff333333), fontSize: 41.98.rpx); return DefaultTextStyle( style: style, child: Container( width: context.width, height: context.height, color: const Color(0xB8000000), alignment: Alignment.center, child: Center( child: Column( mainAxisSize: MainAxisSize.min, children: [ Container( decoration: BoxDecoration( color: const Color(0xE6FFFCF4), borderRadius: BorderRadius.only( bottomLeft: Radius.circular(2.25.wp), bottomRight: Radius.circular(2.25.wp))), padding: EdgeInsets.fromLTRB( 4.5.wp, MediaQuery.of(context).padding.top + 4.5.wp, 4.5.wp, 11.4.wp), child: _wRich(), ), Obx(() => offCount(secondCount.value)), const Spacer() ], ), ), )); } Widget _wTitle(CPExtraInfoChoiceQuestion extraInfo) { const color = Color(0x80000000); return Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ Image.asset(Assets.imagesWarnFastThinker, width: 9.67.wp, color: color), Text( '快速思考', style: TextStyle(color: color, fontSize: 4.58.wp), ), Text( ' Think Fast', style: TextStyle(color: const Color(0x33333333), fontSize: 3.56.wp), ), const Spacer(), bean(extraInfo.beanCount, 3.31.wp) ], ); } Widget _wRich() { final extraInfo = widget.point.extraInfo!; if (extraInfo is CPExtraInfoChoiceQuestion) { return wExtraInfoChoiceQuestion(extraInfo); } else { throw UnimplementedError('wExtraInfo: $extraInfo 未实现'); } } Widget wExtraInfoChoiceQuestion(CPExtraInfoChoiceQuestion extraInfo) { final children = []; var hasImage = false; if (extraInfo.image != null) { if (extraInfo.image!.md5.isNotEmpty) { hasImage = true; children.add(Container( decoration: BoxDecoration( border: Border.all(color: Colors.white, width: 0.78.wp), borderRadius: BorderRadius.circular(1.78.wp)), clipBehavior: Clip.hardEdge, height: 40.97.wp, child: ClipRRect( borderRadius: BorderRadius.circular(1.78.wp), child: AppNetImage( netImage: extraInfo.image!, fit: BoxFit.fitHeight, )))); } } children.addAll([ SizedBox(height: 2.29.wp), ConstrainedBox( constraints: hasImage ? const BoxConstraints() : BoxConstraints(minHeight: 26.0.wp), child: Container( width: double.infinity, alignment: Alignment.centerLeft, child: Text(extraInfo.question, style: TextStyle(fontSize: 4.58.wp)), ), ), SizedBox(height: 2.29.wp), ]); var ascii = 65; for (var i = 0; i < extraInfo.answers.length; i++) { final one = extraInfo.answers[i]; final sn = const Utf8Codec().decode([ascii]); final selected = i == selectedIndex; children.add(GestureDetector( onTap: () async { if (selectedIndex == null) { setState(() { selectedIndex = i; }); if (i == extraInfo.rightIndex) { widget.onBeanCount(extraInfo.beanCount); } widget.point.userAnswerIndex = selectedIndex; widget.point.isAnswerCorrect = selectedIndex == extraInfo.rightIndex; isAnswerOk = widget.point.isAnswerCorrect; _setFinish(); } }, child: Container( margin: EdgeInsets.only(top: 2.8.wp, bottom: 2.8.wp), padding: EdgeInsets.only(left: 4.8.wp), alignment: Alignment.centerLeft, decoration: BoxDecoration( color: Color(selected ? 0xff00a0ff : 0xff017dc7), borderRadius: BorderRadius.circular(1.78.wp)), height: 13.49.wp, width: double.infinity, child: Text('$sn. $one', maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle(color: Colors.white))))); ascii++; } return Column( mainAxisSize: MainAxisSize.min, children: [ _wTitle(extraInfo), const Divider(), Padding( padding: EdgeInsets.only(left: 8.52.wp, right: 8.52.wp, top: 7.26), child: Column( mainAxisSize: MainAxisSize.min, children: children, )) ], ); } } class _Empty extends StatelessWidget { @override Widget build(BuildContext context) { SizeFit.screenInit(context); final info = CPExtraInfoChoiceQuestion() ..question = '计算题 23 + 8 - 6 = ?' ..answers = ['22', '2312312312311', '242323', '21231231211111231235'] ..rightIndex = 3; return Scaffold( floatingActionButton: FloatingActionButton( onPressed: () => showDialogCheckRich( MControlPoint() ..sn = '3' ..areaId = 'A55' ..checkAfterPrev = 2.1.minutes ..extraInfo = info, 3.seconds, )), ); } } void main() async { runApp(GetMaterialApp(theme: appThemeData(), home: _Empty())); }