Untitled
unknown
plain_text
5 months ago
27 kB
2
Indexable
// ignore_for_file: avoid_dynamic_calls, strict_raw_type import 'package:clean/user_app/core/constants/extensions/widget_extensions.dart'; import 'package:clean/user_app/data/models/bet_slip/bet_slip_item/bet_slip_item.dart'; import 'package:clean/user_app/presentation/notifiers/spin_win/spin_win_notifier.dart'; import 'package:clean/user_app/presentation/resources/fonts_manager.dart'; import 'package:clean/user_app/presentation/resources/values_manager.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; // ignore_for_file: argument_type_not_assignable , list_element_type_not_assignable , invalid_assignment , return_of_invalid_type_from_closure,non_bool_operand class OverlayView extends StatefulWidget { const OverlayView({super.key}); @override State<OverlayView> createState() => _OverlayViewState(); } class _OverlayViewState extends State<OverlayView> { late Size size; late SpinAndWinNotifier _spinNotifier; @override void initState() { super.initState(); } @override Widget build(BuildContext context) { _spinNotifier = Provider.of<SpinAndWinNotifier>(context, listen: false); return _overlayView(); } double overlayRightPadding = 0; double overlayTopPadding = 0; double largeNumberHeight = 85; double largeNumberWidth = 80; Widget _overlayView() => Selector<SpinAndWinNotifier, ValueListenable<bool>>( selector: (_, SpinAndWinNotifier provider) => provider.value, builder: ( BuildContext context, ValueListenable<bool> value, Widget? child, ) => ValueListenableBuilder<bool>( valueListenable: value, builder: (BuildContext context, bool value, Widget? child) { if (value) { return Container( color: Colors.black54, width: double.maxFinite, height: double.maxFinite, child: _overlayItem(), ).center(); } else { return Container(); } }, ), ); Widget _overlayItem() { _spinNotifier.checkIfNumberInMid(); bool isTop = int.parse( _spinNotifier.numbers[_spinNotifier.currentNumberIndex]['number'], ) % 3 == 0; String number = _spinNotifier.slectedNumber; //double height = MediaQuery.sizeOf(context).height; overlayRightPadding = MediaQuery.sizeOf(context).width / 2.5; overlayTopPadding = 30; return Stack( children: <Widget>[ SizedBox( height: largeNumberHeight * 3.5, child: SingleChildScrollView( child: SizedBox( width: double.maxFinite, height: largeNumberHeight * 3.5, child: Stack( clipBehavior: Clip.none, children: <Widget>[ Positioned( top: overlayTopPadding, bottom: 0, right: overlayRightPadding, child: IgnorePointer(child: _overlaySide(isTop)), ), if (!_spinNotifier.zeroClick) Consumer<SpinAndWinNotifier>( builder: ( BuildContext context, SpinAndWinNotifier myType, Widget? child, ) => _points(number, isTop), ), Positioned( top: 15, right: 10, child: GestureDetector( onTap: () { _spinNotifier.setValueNotifier(false); _spinNotifier.setZeroClick(false); }, child: const Icon( Icons.close, size: AppSize.s40, ), ), ), ], ), ), ), ), ], ); } Widget _overlaySide(bool isTop) { bool lessThan3 = false; bool lessThan36 = false; if (!_spinNotifier.zeroClick) { lessThan3 = (int.parse(_spinNotifier.slectedNumber) >= 0 && int.parse(_spinNotifier.slectedNumber) <= 3); lessThan36 = (int.parse(_spinNotifier.slectedNumber) >= 34 && int.parse(_spinNotifier.slectedNumber) <= 36); } if (_spinNotifier.zeroClick) { return _leftSideOverlay(); } else { return lessThan3 || lessThan36 ? lessThan36 ? _rightSideOverlay() : _leftSideOverlay() : __midSideOverlay(isTop); } } Column __midSideOverlay(bool isTop) => Column( children: <Widget>[ Row( children: <Widget>[ _largeNumberOverlay( _spinNotifier.numbers[_spinNotifier.isMid ? _spinNotifier.currentNumberIndex - 4 : _spinNotifier.currentNumberIndex >= 4 ? isTop ? _spinNotifier.currentNumberIndex - 3 : _spinNotifier.currentNumberIndex - 5 : _spinNotifier.currentNumberIndex - 3]['number'], _spinNotifier.numbers[_spinNotifier.isMid ? _spinNotifier.currentNumberIndex - 4 : _spinNotifier.currentNumberIndex >= 4 ? isTop ? _spinNotifier.currentNumberIndex - 3 : _spinNotifier.currentNumberIndex - 5 : _spinNotifier.currentNumberIndex - 3]['color'], false, ), _largeNumberOverlay( _spinNotifier.numbers[_spinNotifier.isMid ? _spinNotifier.currentNumberIndex - 1 : _spinNotifier.currentNumberIndex >= 4 ? isTop ? _spinNotifier.currentNumberIndex : _spinNotifier.currentNumberIndex - 2 : _spinNotifier.currentNumberIndex]['number'], _spinNotifier.numbers[_spinNotifier.isMid ? _spinNotifier.currentNumberIndex - 1 : _spinNotifier.currentNumberIndex >= 4 ? isTop ? _spinNotifier.currentNumberIndex : _spinNotifier.currentNumberIndex - 2 : _spinNotifier.currentNumberIndex]['color'], false, ), _largeNumberOverlay( _spinNotifier.numbers[_spinNotifier.isMid ? _spinNotifier.currentNumberIndex + 2 : _spinNotifier.currentNumberIndex >= 4 ? isTop ? _spinNotifier.currentNumberIndex + 3 : _spinNotifier.currentNumberIndex + 1 : _spinNotifier.currentNumberIndex + 3]['number'], _spinNotifier.numbers[_spinNotifier.isMid ? _spinNotifier.currentNumberIndex + 2 : _spinNotifier.currentNumberIndex >= 4 ? isTop ? _spinNotifier.currentNumberIndex + 3 : _spinNotifier.currentNumberIndex + 1 : _spinNotifier.currentNumberIndex + 3]['color'], false, ), ], ), Row( children: <Widget>[ _largeNumberOverlay( _spinNotifier.numbers[_spinNotifier.isMid ? _spinNotifier.currentNumberIndex - 3 : _spinNotifier.currentNumberIndex >= 4 ? isTop ? _spinNotifier.currentNumberIndex - 2 : _spinNotifier.currentNumberIndex - 4 : _spinNotifier.currentNumberIndex - 2]['number'], _spinNotifier.numbers[_spinNotifier.isMid ? _spinNotifier.currentNumberIndex - 3 : _spinNotifier.currentNumberIndex >= 4 ? isTop ? _spinNotifier.currentNumberIndex - 2 : _spinNotifier.currentNumberIndex - 4 : _spinNotifier.currentNumberIndex - 2]['color'], false, ), _largeNumberOverlay( _spinNotifier.numbers[_spinNotifier.isMid ? _spinNotifier.currentNumberIndex : _spinNotifier.currentNumberIndex >= 4 ? isTop ? _spinNotifier.currentNumberIndex + 1 : _spinNotifier.currentNumberIndex - 1 : _spinNotifier.currentNumberIndex + 1]['number'], _spinNotifier.numbers[_spinNotifier.isMid ? _spinNotifier.currentNumberIndex : _spinNotifier.currentNumberIndex >= 4 ? isTop ? _spinNotifier.currentNumberIndex + 1 : _spinNotifier.currentNumberIndex - 1 : _spinNotifier.currentNumberIndex + 1]['color'], false, ), _largeNumberOverlay( _spinNotifier.numbers[_spinNotifier.isMid ? _spinNotifier.currentNumberIndex + 3 : _spinNotifier.currentNumberIndex >= 4 ? isTop ? _spinNotifier.currentNumberIndex + 4 : _spinNotifier.currentNumberIndex + 2 : _spinNotifier.currentNumberIndex + 4]['number'], _spinNotifier.numbers[_spinNotifier.isMid ? _spinNotifier.currentNumberIndex + 3 : _spinNotifier.currentNumberIndex >= 4 ? isTop ? _spinNotifier.currentNumberIndex + 4 : _spinNotifier.currentNumberIndex + 2 : _spinNotifier.currentNumberIndex + 4]['color'], false, ), ], ), Row( children: <Widget>[ _largeNumberOverlay( _spinNotifier.numbers[_spinNotifier.isMid ? _spinNotifier.currentNumberIndex - 2 : _spinNotifier.currentNumberIndex >= 4 ? isTop ? _spinNotifier.currentNumberIndex - 1 : _spinNotifier.currentNumberIndex - 3 : _spinNotifier.currentNumberIndex - 1]['number'], _spinNotifier.numbers[_spinNotifier.isMid ? _spinNotifier.currentNumberIndex - 2 : _spinNotifier.currentNumberIndex >= 4 ? isTop ? _spinNotifier.currentNumberIndex - 1 : _spinNotifier.currentNumberIndex - 3 : _spinNotifier.currentNumberIndex - 1]['color'], false, ), _largeNumberOverlay( _spinNotifier.numbers[_spinNotifier.isMid ? _spinNotifier.currentNumberIndex + 1 : _spinNotifier.currentNumberIndex >= 4 ? isTop ? _spinNotifier.currentNumberIndex + 2 : _spinNotifier.currentNumberIndex : _spinNotifier.currentNumberIndex + 2]['number'], _spinNotifier.numbers[_spinNotifier.isMid ? _spinNotifier.currentNumberIndex + 1 : _spinNotifier.currentNumberIndex >= 4 ? isTop ? _spinNotifier.currentNumberIndex + 2 : _spinNotifier.currentNumberIndex : _spinNotifier.currentNumberIndex + 2]['color'], false, ), _largeNumberOverlay( _spinNotifier.numbers[_spinNotifier.isMid ? _spinNotifier.currentNumberIndex + 4 : _spinNotifier.currentNumberIndex >= 4 ? isTop ? _spinNotifier.currentNumberIndex + 5 : _spinNotifier.currentNumberIndex + 3 : _spinNotifier.currentNumberIndex + 5]['number'], _spinNotifier.numbers[_spinNotifier.isMid ? _spinNotifier.currentNumberIndex + 4 : _spinNotifier.currentNumberIndex >= 4 ? isTop ? _spinNotifier.currentNumberIndex + 5 : _spinNotifier.currentNumberIndex + 3 : _spinNotifier.currentNumberIndex + 5]['color'], false, ), ], ), ], ); Widget _points(String number, bool isTop) { int num = 0; try { num = int.parse(number); } catch (e) { num = 0; } double? right = num < 34 ? overlayRightPadding + largeNumberWidth : overlayRightPadding; double? top = _spinNotifier.zeroClick ? overlayTopPadding + 150 : isTop ? overlayTopPadding : _spinNotifier.isMid ? overlayTopPadding + largeNumberHeight : overlayTopPadding + largeNumberHeight * 2; return Positioned( top: top - 10, right: right - 20, child: _pointsIcons(number), ); } Widget _leftSideOverlay() => Stack( children: <Widget>[ Row( children: <Widget>[ Align( alignment: Alignment.topCenter, child: Container( height: largeNumberHeight * 3, width: 70, decoration: BoxDecoration( color: Colors.green.shade900, border: Border.all(color: Colors.white, width: 1.8), ), child: const Text( '0', style: TextStyle( color: Colors.white, fontWeight: FontWeight.bold, ), ).center(), ), ), Column( children: <Widget>[ _largeNumberOverlay( _spinNotifier.numbers[0]['number'], _spinNotifier.numbers[0]['color'], false, ), _largeNumberOverlay( _spinNotifier.numbers[1]['number'], _spinNotifier.numbers[1]['color'], false, ), _largeNumberOverlay( _spinNotifier.numbers[2]['number'], _spinNotifier.numbers[2]['color'], false, ), ], ), if (_spinNotifier.currentNumberIndex <= 2 && !_spinNotifier.zeroClick) Column( children: <Widget>[ _largeNumberOverlay( _spinNotifier.numbers[3]['number'], _spinNotifier.numbers[3]['color'], false, ), _largeNumberOverlay( _spinNotifier.numbers[4]['number'], _spinNotifier.numbers[4]['color'], false, ), _largeNumberOverlay( _spinNotifier.numbers[5]['number'], _spinNotifier.numbers[5]['color'], false, ), ], ), ], ), if (_spinNotifier.zeroClick) Consumer<SpinAndWinNotifier>( builder: ( BuildContext context, SpinAndWinNotifier myType, Widget? child, ) => _pointsIconsZero('0'), ), ], ); Row _rightSideOverlay() => Row( children: <Widget>[ Column( children: <Widget>[ _largeNumberOverlay( _spinNotifier.numbers[30]['number'], _spinNotifier.numbers[30]['color'], false, ), _largeNumberOverlay( _spinNotifier.numbers[31]['number'], _spinNotifier.numbers[31]['color'], false, ), _largeNumberOverlay( _spinNotifier.numbers[32]['number'], _spinNotifier.numbers[32]['color'], false, ), ], ), Column( children: <Widget>[ _largeNumberOverlay( _spinNotifier.numbers[33]['number'], _spinNotifier.numbers[33]['color'], false, ), _largeNumberOverlay( _spinNotifier.numbers[34]['number'], _spinNotifier.numbers[34]['color'], false, ), _largeNumberOverlay( _spinNotifier.numbers[35]['number'], _spinNotifier.numbers[35]['color'], false, ), ], ), ], ); Widget _largeNumberOverlay( String number, Color color, bool show, ) { int currentNumber = int.parse( _spinNotifier.numbers[_spinNotifier.currentNumberIndex]['number'], ); bool isTop = currentNumber % 3 == 0; return _spinNotifier.value.value && _spinNotifier.slectedNumber == number && !_spinNotifier.zeroClick && _spinNotifier.currentNumberIndex > 3 ? _numbersGraterthan3(color, number, isTop) : _spinNotifier.slectedNumber == number && !_spinNotifier.zeroClick ? _stackOfZeroSelctedNumber(color, number, isTop) : Container( height: largeNumberHeight, width: largeNumberWidth, decoration: BoxDecoration( color: color, border: Border.all(color: Colors.white, width: 1.2), ), child: Text( number, textAlign: TextAlign.center, style: const TextStyle( color: Colors.white, fontWeight: FontWeight.bold, fontSize: FontSize.s12, ), ).center(), ); } Widget _stackOfZeroSelctedNumber(Color color, String number, bool isTop) => Consumer<SpinAndWinNotifier>( builder: (BuildContext context, SpinAndWinNotifier myType, Widget? child) => Stack( clipBehavior: Clip.none, children: <Widget>[ Container( height: largeNumberHeight, width: largeNumberWidth, decoration: BoxDecoration( color: color, border: Border.all(color: Colors.white, width: 1.2), ), child: Text( number, textAlign: TextAlign.center, style: const TextStyle( color: Colors.white, fontWeight: FontWeight.bold, fontSize: FontSize.s12, ), ).center(), ), ], ), ); Widget _numbersGraterthan3(Color color, String number, bool isTop) => Container( height: largeNumberHeight, width: largeNumberWidth, decoration: BoxDecoration( color: color, border: Border.all(color: Colors.white, width: 1.2), ), child: Text( number, textAlign: TextAlign.center, style: const TextStyle( color: Colors.white, fontWeight: FontWeight.bold, fontSize: FontSize.s12, ), ).center(), ); _pointsIcons(String number) { List<Widget> stakeList = <Widget>[]; for (final BetSlipItem betSlipItem in _spinNotifier.spinBets) { List location = betSlipItem.locations; for (final element in location) { if (!_spinNotifier.zeroClick) { _checkParent(element, number, stakeList, betSlipItem); } } } return Container( color: Colors.transparent, height: largeNumberHeight * 2, width: largeNumberWidth * 2, child: Stack( children: stakeList, ), ); } _pointsIconsZero( String number, ) { List<Widget> stakeList = <Widget>[]; for (final BetSlipItem betSlipItem in _spinNotifier.spinBets) { List location = betSlipItem.locations; for (final element in location) { if (_spinNotifier.zeroClick) { __checkZeroParent(element, stakeList, betSlipItem); } } } return SizedBox( height: largeNumberHeight * 3.2, width: 100, child: Stack( children: stakeList, ), ); } void __checkZeroParent( element, List<Widget> stakeList, BetSlipItem betSlipItem, ) { if (element['parent'].toString() == '2' && element['position'].toString().toLowerCase() == 'l') { stakeList.add( Positioned( right: 20, top: 115, child: _pointCircle(betSlipItem), ), ); } if (element['parent'].toString() == '3' && element['position'].toString().toLowerCase() == 'l') { stakeList.add( Positioned( right: 20, top: 35, child: _pointCircle(betSlipItem), ), ); } if (element['parent'].toString() == '0' && element['position'].toString().toLowerCase() == 'c') { stakeList.add( Positioned( left: 20, bottom: 90, child: _pointCircle(betSlipItem), ), ); } if (element['parent'].toString() == '1' && element['position'].toString().toLowerCase() == 'l') { stakeList.add( Positioned( right: 20, bottom: 45, child: _pointCircle(betSlipItem), ), ); } if (element['parent'].toString() == '1' && element['position'].toString().toLowerCase() == 'bl') { stakeList.add( Positioned( right: 20, bottom: 2, child: _pointCircle(betSlipItem), ), ); } } void _checkParent( element, String number, List<Widget> stakeList, BetSlipItem betSlipItem, ) { if (element['parent'].toString() == number && element['position'].toString().toLowerCase() == 'c') { stakeList.add( Positioned( right: 67, top: 20, child: _pointCircle(betSlipItem), ), ); } if (element['parent'].toString() == number && element['position'].toString().toLowerCase() == 'tl') { stakeList.add( Positioned( top: 0, left: 50, child: _pointCircle(betSlipItem), ), ); } if (element['parent'].toString() == number && element['position'].toString().toLowerCase() == 't') { stakeList.add( Positioned( top: 0, left: 90, child: _pointCircle(betSlipItem), ), ); } if (element['parent'].toString() == number && element['position'].toString().toLowerCase() == 'tr') { stakeList.add( Positioned( top: 0, right: 10, child: _pointCircle(betSlipItem), ), ); } if (element['parent'].toString() == number && element['position'].toString().toLowerCase() == 'r') { stakeList.add( Positioned( top: 40, right: 10, child: _pointCircle(betSlipItem), ), ); } if (element['parent'].toString() == number && element['position'].toString().toLowerCase() == 'bl') { stakeList.add( Positioned( bottom: 70, left: 50, child: _pointCircle(betSlipItem), ), ); } if (element['parent'].toString() == number && element['position'].toString().toLowerCase() == 'br') { stakeList.add( Positioned( bottom: 70, right: 12, child: _pointCircle(betSlipItem), ), ); } if (element['parent'].toString() == number && element['position'].toString().toLowerCase() == 'b') { stakeList.add( Positioned( bottom: 70, left: 90, child: _pointCircle(betSlipItem), ), ); } if (element['parent'].toString() == number && element['position'].toString().toLowerCase() == 'l') { stakeList.add( Positioned( top: 40, left: 50, child: _pointCircle(betSlipItem), ), ); } } GestureDetector _pointCircle(BetSlipItem betSlipItem) => GestureDetector( onTap: () { _spinNotifier.betslipAction( betSlipItem, ); }, child: Container( color: Colors.transparent, constraints: const BoxConstraints(maxWidth: 30, maxHeight: 30), child: Container( constraints: const BoxConstraints(maxWidth: 20, maxHeight: 20), child: CircleAvatar( radius: 10, backgroundColor: _spinNotifier.isBetExist(betSlipItem) ? Colors.green : Colors.white, child: Icon( _spinNotifier.isBetExist(betSlipItem) ? Icons.check_circle : Icons.circle, color: _spinNotifier.isBetExist(betSlipItem) ? Colors.white : Colors.grey, size: 14, ), ), ), ), ); }
Editor is loading...
Leave a Comment