flutter - 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
解决方案
每次构建小部件然后从中获取时,您都在创建新SodukuSolver
的。因此,您正在覆盖先前迭代的更改。
看起来应该创建一次。您可以覆盖并在那里初始化或在声明它的同一位置初始化它_starting
_list
SodukuSolver
initState
SodukuState
SodukuSolver
推荐阅读
- node.js - Netlify Lambda 函数:不断获取路径必须是字符串类型
- vba - 尝试循环通过五个记录记录集并获得无限循环
- java - 堆栈的Java实现
- ruby-on-rails - 如何在 Rails 中包含查询中的多个订单
- python - 通过标题循环列值
- javascript - Event.preventDefault() 不起作用,表单提交了两次
- python - 正则表达式拆分标点符号和空格,括号内除外
- php - 如何将多张图片保存到 Laravel 的数据库中?
- scala - 如何在 Spark SQL DSL 中表示数学表达式
- javascript - 在 .map 中添加条件