我是扑扑/飞镖的新手。我编写了一个在GridView中显示图块的应用程序。每个图块都有编号和颜色,并分配了一个onTap处理程序。 onTap处理程序用于debugPrint磁贴的索引并调用setState()。使用setState()可以强制重新渲染GridView,并在Color.white中显示带有轻敲的图块。
在调试模式下执行时,设备上的显示符合预期。轻敲图块后,调试控制台中会显示debugPrint消息,但是轻敲的图块的颜色不会更改为Color.white。
我已经检查了重新生成图块时(点击图块时)。正如预期的那样,所有未开发的图块均分配有其原始图块颜色。轻敲的图块被分配为Color.white。但是,似乎无法检测到图块颜色的变化(即,将轻拍的图块颜色从其原始颜色更改为Color.white),并且该应用程序未使用一个白色图块进行重新绘制。
应用代码如下。请告知我我做错了。
// ignore_for_file: camel_case_types
// ignore_for_file: constant_identifier_names
// ignore_for_file: non_constant_identifier_names
import 'package:flutter/material.dart';
const List _normal_colors = [
Colors.indigo,
Colors.green,
Colors.amber,
Colors.orange,
Colors.red,
Colors.blue,
Colors.cyan,
Colors.yellow,
Colors.purple,
]; // _normal_colors
void main() => runApp(new MyApp());
class Tiled_Surface extends StatefulWidget {
Tiled_Surface({Key key}) : super(key: key);
@override // Tiled_Surface
Tiled_Surface_State createState() => Tiled_Surface_State();
}
class Tiled_Surface_State extends State<Tiled_Surface> {
List<GridTile> _grid_tiles = <GridTile>[];
int _tapped = -1;
void on_tile_tapped(int index) {
debugPrint("You tapped on item $index");
setState(() {
_tapped = index;
});
} // on_tile_tapped
GridTile new_surface_tile(Color tile_color, int index) {
GridTile tile = GridTile(
child: GestureDetector(
onTap: () => on_tile_tapped(index),
child: Container(
child: Center(
child: Text (
index.toString(),
style: TextStyle(
fontSize: 24.0,
color: _tapped == index ?
Colors.black :
Colors.white,),
)
),
decoration: BoxDecoration(
color: _tapped == index ?
Colors.white :
tile_color,
shape: BoxShape.rectangle,
),
),
)
);
return (tile);
} // new_surface_tile
List<GridTile> surface_tiles(colors) {
_grid_tiles.clear();
for (int i = 0; (i < colors.length); i++) {
_grid_tiles.add(new_surface_tile(colors[i], i));
}
return (_grid_tiles);
} // surface_tiles
@override // Tiled_Surface_State
Widget build(BuildContext context) {
return GridView.count(
shrinkWrap: true,
crossAxisCount: 3,
childAspectRatio: 1.0,
padding: const EdgeInsets.all(4.0),
mainAxisSpacing: 4.0,
crossAxisSpacing: 4.0,
children: surface_tiles(_normal_colors),
);
}
} // class Tiled_Surface_State
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
Widget tiled_surface = Container(
child: Column(
children: [
Tiled_Surface(),
],
),
);
return MaterialApp(
title: 'Tiled Surface Demo',
home: Scaffold(
appBar: AppBar(title: Text('Tiled Surface Demo'),
actions: <Widget>[
IconButton(
tooltip: "Replay",
icon: Icon(Icons.replay),
onPressed: () {
// TODO _reinitialize_tiles ( );
},
),
] ),
body: Column(
children: [
tiled_surface,
],
),
),
);
}
}
此问题与建议的答案不同,因为此问题处理ListView的私有类,而此问题涉及GridView。
答案 0 :(得分:0)
如here所述,发生此问题是因为您没有遵循不变性原则。
问题的根源在于您的surface_tiles
方法。重用旧列表而不是创建新列表。
修复非常简单:
List<GridTile> surface_tiles(colors) {
_grid_tiles = List<Widget>();
// push items to grid_tiles
代替
List<GridTile> surface_tiles(colors) {
_grid_tiles.clear()
// push items to grid_tiles