闲暇时刻用Flutter写了一个夜间爆闪提示器

爆闪策略1:双色交替闪

爆闪策略1:双色交替 后 双色全亮 闪五次

效果视频 # 安全行车 # 爆闪灯 # 奥迪a6l 爆闪频率逐渐升高 刚才没啥事用# flutter 写的App v.douyin.com/iFnLFvGF/

flutter源码 gist.github.com/330132662/b...

ini 复制代码
import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';

/**
*  红蓝爆闪
*/
class RedBlue extends StatefulWidget {
 const RedBlue({super.key});

 @override
 State<RedBlue> createState() => _RedBlueState();
}

class _RedBlueState extends State<RedBlue> {
 @override
 void initState() {
   super.initState();
 }

 @override
 Widget build(BuildContext context) {
   return _body();
 }

 Widget _body() {
   return Scaffold(
       body: GestureDetector(
     child: Column(
       children: [
         Container(
           height: ScreenUtil().screenHeight / 2,
           // width: MediaQuery.of(context).size.width,
           width: ScreenUtil().screenWidth,
           color: red,
         ),
         Container(
           height: ScreenUtil().screenHeight / 2,
           // width: MediaQuery.of(context).size.width,
           width: ScreenUtil().screenWidth,
           color: blue,
         ),
       ],
     ),
     onTap: _allClick,
   ));
 }

 bool _isRed = false;
 Color closeLed = Colors.yellowAccent;

 Color? red = Colors.red;
 Color? blue = Colors.blue;
 bool _isRun = false;
 // late Timer _timer;
 final int _timeDistance = 100;

 _allClick() {
   _flashBlue();
 }

/*
无限交替方案
*/
 _startFlash() {
   if (_isRed) {
     //   亮红的
     _closeBlue();
     _showRed();
   } else {
     //  亮蓝的
     _showBlue();
     _closeRed();
   }
   _isRed = !_isRed;
   setState(() {});
 }

 /**
  *  单色交替循环 次数
  */
 final int singleTimes = 2;
 int singleTimess = 0;

 /**
  *  aabbaabb abab
  *
  *  bb--rr
  */
 _flashBlue() {
   Future.delayed(Duration(milliseconds: _timeDistance), () {
     blue = Colors.blue;
     if (mounted) {
       setState(() {});
     }
     Future.delayed(Duration(milliseconds: _timeDistance), () {
       _closeBlue();

       Future.delayed(Duration(milliseconds: _timeDistance), () {
         blue = Colors.blue;
         if (mounted) {
           setState(() {});
         }
         Future.delayed(Duration(milliseconds: _timeDistance), () {
           _closeBlue();
           _flashred2();
         });
       });
     });
   });
   // 亮红的两次

   if (!_exit) {
     _isRun = false;
   } else {
     _isRun = true;
     // _exit = true;
   }
 }

 /**
  * rr -- bb
  */
 _flashred2() {
   if (!_exit) {
     Future.delayed(Duration(milliseconds: _timeDistance), () {
       red = Colors.red;
       if (mounted) {
         setState(() {});
       }
       Future.delayed(Duration(milliseconds: _timeDistance), () {
         _closeRed();
         Future.delayed(Duration(milliseconds: _timeDistance), () {
           red = Colors.red;
           if (mounted) {
             setState(() {});
           }
           Future.delayed(Duration(milliseconds: _timeDistance), () {
             _closeRed();
             singleTimess++;

             if (singleTimess < singleTimes) {
               _flashBlue();
             } else {
               singleTimess = 0; // 单词爆闪归零
               _flashrb();
             }
           });
         });
       });
     });
   }
 }

 /**
  *  红蓝一起亮
  */
 final int _recycleTimes = 6;
 int countRec = 0;

 _flashrb() {
   Future.delayed(Duration(milliseconds: _timeDistance), () {
     red = Colors.red;
     blue = Colors.blue;
     Future.delayed(Duration(milliseconds: _timeDistance), () {
       _closeRed();
       _closeBlue();
     });
     countRec++;
     print("次数 $countRec");
     if (countRec < _recycleTimes) {
       Future.delayed(Duration(milliseconds: _timeDistance), () {
         _flashrb(); //不到4 就递归
       });
     } else {
       countRec = 0;
       _flashBlue(); // 全亮4次后重新开始单色爆闪
     }
     if (mounted) {
       setState(() {});
     }
     // _flash1();
   });
 }

 _showRed() {
   Future.delayed(Duration(milliseconds: _timeDistance), () {
     red = Colors.red;
     if (mounted) {
       setState(() {});
     }
     Future.delayed(Duration(milliseconds: _timeDistance), () {
       _closeRed();
     });
   });
   if (!_isRun) {}
 }

 _closeRed() {
   // red = Color(0xFFAB130B);
   red = closeLed;
   if (mounted) {
     setState(() {});
   }
 }

 /**
  *  设为 true  停止所有
  */
 bool _exit = false;

 _showBlue() {
   Future.delayed(Duration(milliseconds: _timeDistance), () {
     blue = Colors.blue;
     if (mounted) {
       setState(() {});
     }
     Future.delayed(Duration(milliseconds: _timeDistance), () {
       _closeBlue();
       blue = Colors.blue;
     });
   });
   if (!_isRun) {}
 }
                                                                              
 _closeBlue() {
   // blue = Color(0xFF040C88);
   blue = closeLed;
   if (mounted) {
     setState(() {});
   }
 }

 @override
 void dispose() {
   _exit = true;
   print("退出 $_exit");
   super.dispose();
 }
}
相关推荐
墨渊君1 小时前
“蒙”出花样!用 CSS Mask 实现丝滑视觉魔法
前端·css
huabuyu2 小时前
基于 React + MarkdownIt 的 Markdown 渲染器实践:支持地图标签和长按复制
前端
芦苇Z2 小时前
HTML <a> 标签的 rel 属性全解析:安全、隐私与 SEO 最佳实践
前端·html
在这儿不行2 小时前
Android 15边到边模式
前端
源猿人2 小时前
企业级文件浏览系统的Vue实现:架构设计与最佳实践
前端·javascript·数据可视化
红红大虾2 小时前
Defold引擎中关于CollectionProxy的使用
前端·游戏开发
最后一个农民工2 小时前
vue3实现仿豆包模版式智能输入框
前端·vue.js
xw53 小时前
uni-app中v-if使用”异常”
前端·uni-app
!win !3 小时前
uni-app中v-if使用”异常”
前端·uni-app