【问题标题】:Flutter: setState() is invalid for type of ListFlutter:setState() 对 List 类型无效
【发布时间】:2020-02-08 07:51:18
【问题描述】:

我的兄弟们!对不起,我的英语很糟糕,希望你能理解。

我无法使用setState((){}) 更新列表类型的变量!我试图解决这个问题很长时间,但我失败了。

这是我的演示代码,你可以运行:

import 'package:flutter/material.dart';

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

class TestListUpdate extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: TestListUpdatePage(),
    );
  }
}

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

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

class _TestListUpdatePageState extends State<TestListUpdatePage> {
  int _counter = 0;
  List<Widget> _list = [];

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  void _addPic() {

    setState(() {
      _list.add(
        ClipRRect(
            borderRadius: BorderRadius.circular(5),
            child: Image.network(
              'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1581151314271&di=6d55b078b319acc55d081685e3208b6c&imgtype=0&src=http%3A%2F%2Fimg-download.pchome.net%2Fdownload%2F1k1%2Fe0%2F32%2Fol8r6m-1sqx.jpg',
              fit: BoxFit.cover,
            )),
      );
    });
    print(_list.length);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Test'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
            Container(
                height: 100,
                child: GridView.count(
                  physics: NeverScrollableScrollPhysics(),
                  crossAxisCount: 4,
                  crossAxisSpacing: 5,
                  mainAxisSpacing: 5,
                  children: _list,
                ))
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          _incrementCounter();
          _addPic();
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}


当我按下添加按钮时,数字已经改变。但是网格的数据没有改变..

请帮帮我!谢谢你!!

【问题讨论】:

  • 尝试将 _list 从 List 更改为 List。只需将 URL 存储在 _list 中
  • 谢谢,泰德亨利!这是一个很好的解决方案。但我真正的项目,网格有不同的类型,图像只是一种类型。也许对我来说有更好的方法?
  • @HarrisonQi 使用List&lt;dynamic&gt;
  • 使用 List 或创建一个接口,例如 Gridable,网格中的所有模型都将实现该接口,然后使用 List。无论哪种方式,仅将模型数据存储在 _list 中。每次调用 setState 时重新构建 build 中的小部件。

标签: flutter gridview dart setstate


【解决方案1】:

将列表初始化移至 initState 函数

改变:

List<Widget> _list = [];

到:

List<Widget> _list;

在 initState 函数中初始化列表:

@override
void initState() {
 super.initState();
 _list = [];
}

【讨论】:

  • 为什么会有任何不同?
  • 你是对的,它不会有任何区别我认为问题是别的。 @YuuWoods 的答案是正确的。
【解决方案2】:

您可以使用“GridView.builder”。你的“setState”正在工作。不工作的是“GridView.count”。

Container(
  height: 100,
  child: GridView.builder(
    itemBuilder: (context, index) {
      return _list[index];
    },
    itemCount: _list.length,
    physics: NeverScrollableScrollPhysics(),
    gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
      crossAxisCount: 4,
      crossAxisSpacing: 5,
      mainAxisSpacing: 5,
    ),
  ),
),

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 2021-04-14
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    相关资源
    最近更新 更多