我有一个有状态的小部件,它有一个简单的网格,每个网格单元都有一个容器.
我想点击一个单元格/容器并更改其内容.
问题是GestureDetector - > onTap方法在所有cels的app刷新时被触发.
在下面的示例中,该_changeCell方法立即针对所有cels触发,onTap但不起作用.
有任何想法吗?
import 'package:flutter/material.dart';
class GridWidget extends StatefulWidget {
@override
_GridWidgetState createState() => new _GridWidgetState();
}
class _GridWidgetState extends State<GridWidget> {
@override
Widget build(BuildContext context) {
Color cellColor = Colors.white;
Text cellText = new Text('');
// when a cell is tapped, change the color and text
_changeCell(index) {
setState(() {
cellColor = Colors.lightBlue;
cellText = new Text('clicked');
});
print("Container clicked " + index.toString());
}
// create a 5 by 5 grid
return new GridView.count(
crossAxisCount: 5,
children: new List.generate(5, (index) {
return new GestureDetector(
onTap: _changeCell(index),
child: new Container(
width: double.infinity,
height: double.infinity,
decoration: new BoxDecoration(
color: cellColor,
),
child: new Center(
child: cellText,
),
),
);
}),
);
}
}
Run Code Online (Sandbox Code Playgroud)
rmt*_*zie 16
您的代码在这一行有问题:
onTap: _changeCell(index),
Run Code Online (Sandbox Code Playgroud)
基本上,不是将 onTap 设置为方法,而是直接调用该方法并将 onTap 设置为该调用的结果 (null)。每次构建小部件时,它都会调用该函数。
你应该做的是:
onTap: () => _changeCell(index)
Run Code Online (Sandbox Code Playgroud)
Aja*_*mar 11
只需更改onTap: _changeCell(index) 为即可onTap: () => _changeCell(index)。_changeCell(index)返回null,并将null设置为onTap并调用相同的函数。
下面的代码是为此
我玩了一点。
import 'package:flutter/material.dart';
void main() {
runApp(new MaterialApp(
home: new DemoScreen(),
));
}
class DemoScreen extends StatefulWidget {
@override
_DemoScreenState createState() => new _DemoScreenState();
}
class _DemoScreenState extends State<DemoScreen> {
Color cellColor = Colors.white;
Text _getText(index) {
Text text;
switch (index) {
case 0:
text = new Text('lightBlue');
break;
case 1:
text = new Text('red');
break;
case 2:
text = new Text('green');
break;
case 3:
text = new Text('yellow');
break;
case 4:
text = new Text('orange');
break;
default:
text = new Text('brown');
break;
}
return text;
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("Demo App"),
),
body: new GridView.count(
crossAxisCount: 5,
children: new List.generate(5, (index) {
return new MyWidget(
index: index,
color: cellColor,
text: _getText(index),
);
}),
),
);
}
}
class MyWidget extends StatefulWidget {
final Color color;
final Text text;
final int index;
MyWidget({this.color, this.text, this.index});
@override
_MyWidgetState createState() => new _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
Color cellColor = Colors.white;
Text cellText = new Text('white');
@override
void initState() {
super.initState();
cellColor = widget.color;
cellText = widget.text;
}
_changeCell(index) {
setState(() {
switch (index) {
case 0:
cellColor = Colors.lightBlue;
cellText = new Text('lightBlue');
break;
case 1:
cellColor = Colors.red;
cellText = new Text('red');
break;
case 2:
cellColor = Colors.green;
cellText = new Text('green');
break;
case 3:
cellColor = Colors.yellow;
cellText = new Text('yellow');
break;
case 4:
cellColor = Colors.orange;
cellText = new Text('orange');
break;
default:
cellColor = Colors.brown;
cellText = new Text('brown');
break;
}
});
print("Container clicked " + index.toString());
}
@override
Widget build(BuildContext context) {
return new GestureDetector(
onTap: () => _changeCell(widget.index),
child: new Container(
margin: new EdgeInsets.symmetric(horizontal: 1.0),
width: double.infinity,
height: double.infinity,
decoration: new BoxDecoration(
color: cellColor,
),
child: new Center(
child: cellText,
),
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你 :)
TLDR 为那些寻求快速解决方案的人提供了答案。
改变:
onTap: () => myMethod,
Run Code Online (Sandbox Code Playgroud)
对此:
onTap: (){ myMethod();},
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5655 次 |
| 最近记录: |