gpt4 book ai didi

flutter - setState对 Dart/flutter 中的对象起作用吗?

转载 作者:行者123 更新时间:2023-12-03 04:15:30 26 4
gpt4 key购买 nike

我有一个 flutter 小部件,它试图解决soduku网格。我有一个名为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,屏幕上的网格也不会更新做更新。

最佳答案

只需将代码添加到initState()方法中,如下所示

    @override
void initState() {
super.initState();

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

就您而言,您的列表没有更新,因为setState()方法将调用您的SodukuSolver()和ss.getList();。每次的方法。因为setSate()最终每次都会调用build方法进行渲染。

因此,将其添加到您的initState方法中将解决您的问题。当屏幕/路由初始化时,它仅被调用一次。

关于flutter - setState对 Dart/flutter 中的对象起作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59264987/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com