我想用列表视图和JSON显示数据列表。此代码包含在stateless widget
文件中。登录后打开此页面。当我尝试stateful widget
时,代码正常运行。在stateless widget
中,当我调试它时,代码没有调用函数getData()。但是直接去了
Widget build(BuildContext context) {
return new Scaffold( ...
这里是完整的代码:
class frmClass extends StatelessWidget{
List<dynamic> dta;
get setState => null;
Future<String> getData() async {
var uri ='https://xxxx.com/class';
var map = new Map<String, dynamic>();
map["username"] = "abc";
map["password"] = "1234";
http.Response response = await http.post(
uri,
body: jsonEncode(map),
);
Map<String,dynamic> mp = jsonDecode(utf8.decode(response.bodyBytes));
this.setState(() {
dta = mp["data"];
debugPrint(dta.toString());
});
}
@override
void initState(){
this.getData();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
backgroundColor:Colors.transparent,
elevation: 0.0,
iconTheme: new IconThemeData(color: Color(0xFF18D191))),
body: new ListView.builder(
itemCount: dta == null ? 0 : dta.length,
itemBuilder: (BuildContext context, int index){
return new Card(
child: new Text(dta[index]["className"]),
);
}
),
);
}
}
我该如何解决?
答案 0 :(得分:0)
之所以发生这种情况,是因为无状态小部件没有initState
,这就是以下代码永远不会被调用的原因。如果您要使用无状态小部件,然后在类构造函数中传递数据并在需要的任何地方使用它,则无状态小部件更类似于没有生命周期方法的呈现平面UI。
@override
void initState(){
this.getData();
}
答案 1 :(得分:0)
您可以使用FutureBuilder将getData()调用到StatelessWidget的build()方法中:
https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html
但是,这将在每次重建无状态窗口小部件时触发getData()。
另一种方法是使用反应式编程架构(例如Bloc,rxdart等。)。
根据您的需要,每次或仅一次(或当您的条件为真/假时)触发getData()。