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,
          ),
        ),
      ),
    );
  }
}