【发布时间】: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<dynamic>。 -
使用 List
或创建一个接口,例如 Gridable,网格中的所有模型都将实现该接口,然后使用 List 。无论哪种方式,仅将模型数据存储在 _list 中。每次调用 setState 时重新构建 build 中的小部件。
标签: flutter gridview dart setstate