Dart 颤振-在GestureDetector点击上更新视图
我正在尝试使用手势检测器更改用户单击的元素的颜色:Dart 颤振-在GestureDetector点击上更新视图,dart,flutter,Dart,Flutter,我正在尝试使用手势检测器更改用户单击的元素的颜色: new GestureDetector( onTap: (){ // Change the color of the container beneath }, child: new Container( width: 80.0, height: 80.0, margin: new EdgeInsets.all(10.0), color: Colors.orang
new GestureDetector(
onTap: (){
// Change the color of the container beneath
},
child: new Container(
width: 80.0,
height: 80.0,
margin: new EdgeInsets.all(10.0),
color: Colors.orange,
),
),
问题是我不能在onTap内部使用setState。否则我会创建一个颜色变量。有什么建议吗?您可以在onTap
的内部使用。事实上,在这种情况下,这正是正确的做法。如果调用setState()
时遇到问题,请确保小部件是有状态的(请参阅)
您可能还想签出或作为更多的物质的方式来捕捉触摸。如果您真的需要,请仔细阅读以确保您正确配置了它
下面是一个示例,每次单击时都会更改为随机颜色
import'dart:math';
进口“包装:颤振/材料.省道”;
void main(){
runApp(新的MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
标题:“颤振演示”,
home:newmyhome(),
);
}
}
类MyHome扩展了StatefulWidget{
@凌驾
State createState()=>new_MyHomeState();
}
类MyHomeState扩展状态{
最终随机数_Random=新随机数();
颜色_Color=Colors.orange;
@凌驾
小部件构建(构建上下文){
归还新脚手架(
正文:新中心(
儿童:新的手势检测器(
onTap:(){
//更改下面容器的颜色
设置状态(){
_颜色=新颜色。fromRGBO(
_随机。nextInt(256),
_随机。nextInt(256),
_随机。nextInt(256),
1
);
});
},
子容器:新容器(
宽度:80.0,
身高:80.0,
边距:所有新边集(10.0),
颜色:_颜色,
),
),
),
);
}
}
是的,问题是我没有在构建函数中使用它,而是将它放在变量中。。。谢谢,通常最好在build()中创建小部件,而不是存储它们。
import 'dart:math';
import 'package:flutter/material.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
home: new MyHome(),
);
}
}
class MyHome extends StatefulWidget {
@override
State createState() => new _MyHomeState();
}
class _MyHomeState extends State<MyHome> {
final Random _random = new Random();
Color _color = Colors.orange;
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Center(
child: new GestureDetector(
onTap: () {
// Change the color of the container beneath
setState(() {
_color = new Color.fromRGBO(
_random.nextInt(256),
_random.nextInt(256),
_random.nextInt(256),
1.0
);
});
},
child: new Container(
width: 80.0,
height: 80.0,
margin: new EdgeInsets.all(10.0),
color: _color,
),
),
),
);
}
}