Dart 如何在Flatter中使用setstate()在相机应用程序中以特定间隔更改custompaint颜色?

Dart 如何在Flatter中使用setstate()在相机应用程序中以特定间隔更改custompaint颜色?,dart,flutter,flutter-layout,flutter-animation,Dart,Flutter,Flutter Layout,Flutter Animation,我需要在使用foregroundpainter的相机应用程序中,以一定的间隔(比如定时器。周期性)更改custompaint的颜色。我怎样才能做到呢?我可以在setstate()内打印“timer”,但颜色(r、g、b值)不会改变。setstate()func似乎得到了处理(因为我打印了“timer”),但custompaint不会改变r、g、b值 import 'dart:async'; import 'package:flutter/material.dart'; import 'pa

我需要在使用foregroundpainter的相机应用程序中,以一定的间隔(比如定时器。周期性)更改custompaint的颜色。我怎样才能做到呢?我可以在setstate()内打印“timer”,但颜色(r、g、b值)不会改变。setstate()func似乎得到了处理(因为我打印了“timer”),但custompaint不会改变r、g、b值

 import 'dart:async';
 import 'package:flutter/material.dart';
 import 'package:camera/camera.dart';

 List<CameraDescription> cameras;

 Future<void> main() async {
 cameras = await availableCameras();
 runApp(CameraApp());
  }
 var temp;

 class CameraApp extends StatefulWidget {
  @override
   _CameraAppState createState() => _CameraAppState();
  }

   var r = 255;
   var g = 0;
   var b = 0;
   class _CameraAppState extends State<CameraApp> {
   CameraController controller;

 var crossPainter = CrossPainter(r, g, b);
 @override
 void initState() {
   super.initState();
   controller = CameraController(cameras[0], 
    ResolutionPreset.medium);
   controller.initialize().then((_) {
    if (!mounted) {
     return;
       }
  setState(() {
  Timer(new Duration(seconds: 5), () {
        r = 0;
        g = 255;
        b = 0;
        print('timer');
        crossPainter = CrossPainter(r, g, b);

      });

      });
      });
      }

    @override
     void dispose() {
        controller?.dispose();
        super.dispose();
         }


        var t = Timer.periodic(new Duration(milliseconds: 500), 
    (Timer timer)=>  CrossPainter(225,0,0));

  @override
   Widget build(BuildContext context) {
   if (!controller.value.isInitialized) {
      return Container();
        }



   return  CustomPaint(
       //foregroundPainter: CrossPainter(r, g, b),

       foregroundPainter:crossPainter,
          size:Size(100, 100),
       willChange:true,
            child: CameraPreview(controller));

      }
     }

   class CrossPainter extends CustomPainter{

     @override

     Paint _paint;
      CrossPainter(r,g,b){

      _paint = Paint()
      ..color = Color.fromRGBO(r,g,b,1)
      ..strokeWidth = 2.0
      ..strokeCap = StrokeCap.round;


         }

     @override
     void paint(Canvas canvas, Size size) {

     var rect = Offset(100,0.0) & size;

     canvas.drawRect(rect, _paint);

       }


      @override
     bool shouldRepaint(CustomPainter oldDelegate) {

      return true;
       }

       }
导入'dart:async';
进口“包装:颤振/材料.省道”;
导入“包:摄像机/摄像机.dart”;
列出摄像机;
Future main()异步{
摄像头=等待可用摄像头();
runApp(CameraApp());
}
无功温度;
类CameraApp扩展StatefulWidget{
@凌驾
_CameraAppState createState()=>\u CameraAppState();
}
var r=255;
var g=0;
var b=0;
类_CameraAppState扩展状态{
摄像机控制器;
var crossPainter=crossPainter(r,g,b);
@凌驾
void initState(){
super.initState();
控制器=摄像机控制器(摄像机[0],
分辨率预设(中等);
controller.initialize()。然后((){
如果(!已安装){
返回;
}
设置状态(){
计时器(新的持续时间(秒:5),(){
r=0;
g=255;
b=0;
打印(“计时器”);
交叉油漆工=交叉油漆工(r、g、b);
});
});
});
}
@凌驾
无效处置(){
控制器?.dispose();
super.dispose();
}
var t=定时周期(新的持续时间(毫秒:500),
(计时器)=>CrossPainter(225,0,0));
@凌驾
小部件构建(构建上下文){
如果(!controller.value.isInitialized){
返回容器();
}
返回自定义油漆(
//前景画家:交叉画家(r,g,b),
前景画家:交叉画家,
尺寸:尺寸(100100),
willChange:没错,
子女:CameraPreview(控制员));
}
}
类CrossPainter扩展了CustomPainter{
@凌驾
油漆;
交叉油漆工(r、g、b){
_油漆=油漆()
…颜色=颜色。来自RGBO(r,g,b,1)
..冲程宽度=2.0
..strokeCap=strokeCap.round;
}
@凌驾
空心油漆(帆布,尺寸){
var rect=偏移量(100,0.0)和大小;
画布.drawRect(rect,_paint);
}
@凌驾
bool应重新绘制(自定义代理){
返回true;
}
}

您能否检查小部件是否安装在您的设置状态中,并查看这是否有任何区别
bool mount=this.mounted;打印(安装)//true
它打印true,还有其他答案吗?我的意思是,类似loadData()async{final location=wait location.fetchByID(this.locationID);如果(mounted){setState((){this.location=location;});}}无法使用上述代码,则未定义我的get locationID,你能详细说明一下我们需要找到什么吗?对不起,位置id只是一个例子,你可以使用你的代码,不确定会发生什么