闲暇时刻用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();
 }
}
相关推荐
weixin_382395238 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__8 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.8 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~9 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华10 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子12 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅12 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni13 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学14 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端