【问题标题】:setState does not update GridView in fluttersetState 不会在颤动中更新 GridView
【发布时间】:2021-09-26 03:07:35
【问题描述】:

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

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

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

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

我做错了什么?

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),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

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

    GridView.count(
      crossAxisCount: 2,
      children: [
        ...geza
      ],
    ),
    

    【讨论】:

      【解决方案2】:

      我认为 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),
            ),
          );
        }
      }
      

      【讨论】:

      • 我接受了另一种解决方案,因为它执行起来更快,但您的想法也有效且易于理解。谢谢你:)
      猜你喜欢
      • 2019-04-02
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      相关资源
      最近更新 更多