setState 不会在颤振中更新 GridView

时间:2021-07-17 19:39:57

标签: flutter dart

我已阅读其他问题,虽然它们的标题与此问题相似,但它们并未涵盖我的问题。请阅读下文。

我使用的是 Android Studio。我有一个带有 GridView 的简单有状态应用程序。它的孩子在列表“geza”中。当我按下按钮时,一个 Text('Hello') 被添加到列表中。

这是在 setState() 方法中完成的。新添加的小部件不会出现在网格中。

如果我从 Android Studio 进行热重新部署,那么在重新部署后小部件会出现。所以看起来小部件被添加到列表中,但网格没有更新。

我做错了什么?

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  var geza = <Widget>[ Text('AAA') ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('My Test'),
      ),
      body: Center(
        child: GridView.count(crossAxisCount: 2,
          children: this.geza
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            this.geza.add(Text('Hello'));
          });
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

2 个答案:

答案 0 :(得分:1)

我认为 Flutter 会特别对待小部件列表,正如您在此 similar case 中所见。此解决方案使用 ListView.builder:在您的情况下,您可以使用 GridView.builder,但您也可以在 geza 列表中使用字符串而不是小部件以避免任何进一步的问题:

class _MyHomePageState extends State<MyHomePage> {
  // Use a list of strings
  final List<String> geza = ['AAA'];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('My Test'),
      ),
      body: Center(
        child: GridView.count(
          crossAxisCount: 2,
          // Convert to a list of widgets here
          children: this.geza.map((v) => Text(v)).toList(),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // Add a string to the list
          setState(() => this.geza.add('Hello'));
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

答案 1 :(得分:1)

您可以使用扩展运算符 (Integer.valueOf) 来解决此问题。

...