颜色变化时不抖动

时间:2018-08-27 17:10:19

标签: dart flutter

我是扑扑/飞镖的新手。我编写了一个在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。

1 个答案:

答案 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