首页 > 解决方案 > setState 对 dart/flutter 中的对象有效吗?

问题描述

我有一个试图解决数独网格的颤振小部件。我有一个类SodukuSolver,它进行所有计算并提供List<String>当前结果。我打电话setState刷新列表,但它不会更新屏幕。

下面,我将尝试包含尽可能多的相关代码。完整来源在https://github.com/mankowitz/soduku

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(title: "Soduku solver", home: Soduku());
  }
}

class SodukuState extends State<Soduku> {
  SodukuSolver ss;
  List<String> _list;
  int _changes = 0;
  int _remaining = 81;

  @override
  Widget build(BuildContext context) {

    final String _starting =
        "750943002024005090300020000140089005093050170500360024000070009070400810400198057";
    ss = new SodukuSolver(_starting);
    _list = ss.getList();

    return Scaffold(
      appBar: AppBar(title: Text('Soduku solver'), actions: <Widget>[
        // action button
        IconButton(
          icon: Icon(Icons.directions_walk),
          onPressed: () {
            _iterate();
          },
        ),    
      ]),
      body: _buildGrid(),
    );
  }

  Widget _buildGrid() {
    return Column(children: <Widget>[
      AspectRatio(
        aspectRatio: 1.0,
        child: Container(
          child: GridView.builder(
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: 9,
            ),
            itemBuilder: _buildGridItems,
            itemCount: 81,
          ),
        ),
      ),
    ]);
  }

  Widget _buildGridItems(BuildContext context, int index) {
    return GestureDetector(
      child: GridTile(
        child: Container(
          child: Center(
            child: Text(_list[index]),
          ),
        ),
      ),
    );
  }

  void _iterate() {
    setState(() {
      _changes = ss.iterateSoduku();
      _remaining = ss.empties();
      _list = ss.getList();
    });
  }
}

class Soduku extends StatefulWidget {
  @override
  SodukuState createState() => SodukuState();
}

所以问题是_iterate()被调用了,我可以使用调试器来查看内部状态SodukuSolver正在更新,它甚至可以正确传递,但是屏幕上的网格没有更新,_list即使更新。_changes_remaining

标签: flutterdart

解决方案


每次构建小部件然后从中获取时,您都在创建新SodukuSolver的。因此,您正在覆盖先前迭代的更改。 看起来应该创建一次。您可以覆盖并在那里初始化或在声明它的同一位置初始化它_starting_list
SodukuSolverinitStateSodukuStateSodukuSolver


推荐阅读