Dart 如何在Flatter中使用setstate()在相机应用程序中以特定间隔更改custompaint颜色?
我需要在使用foregroundpainter的相机应用程序中,以一定的间隔(比如定时器。周期性)更改custompaint的颜色。我怎样才能做到呢?我可以在setstate()内打印“timer”,但颜色(r、g、b值)不会改变。setstate()func似乎得到了处理(因为我打印了“timer”),但custompaint不会改变r、g、b值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
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只是一个例子,你可以使用你的代码,不确定会发生什么