Как использовать setstate () во флаттере, чтобы изменить цвет пользовательской краски через определенные промежутки времени в приложении камеры? - PullRequest
0 голосов
/ 31 января 2019

Мне нужно изменить цвет пользовательской краски через определенные промежутки времени (например, Timer.periodic) внутри приложения камеры с помощью foregroundpainter.Как мне этого добиться?Я могу напечатать «таймер» внутри setstate (), но цвет (значения r, g, b) не меняется. Похоже, что функция setstate () обрабатывается (так как я печатаю «таймер»), но 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;
       }

       }
...