Flutter 颤振:如何在无状态小部件中调用函数?
我想用列表视图和JSON显示数据列表。此代码位于带有Flutter 颤振:如何在无状态小部件中调用函数?,flutter,Flutter,我想用列表视图和JSON显示数据列表。此代码位于带有无状态小部件的文件中。并在登录后打开此页面。当我在有状态小部件中尝试时,代码正常运行。在无状态小部件中,当我调试它时,代码没有调用函数getData()。但是直接去了 Widget build(BuildContext context) { return new Scaffold( ... 以下是完整的代码: class frmClass extends StatelessWidget{ List<dynamic
无状态小部件的文件中。并在登录后打开此页面。当我在有状态小部件中尝试时,代码正常运行。在无状态小部件中,当我调试它时,代码没有调用函数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"]),
);
}
),
);
}
}
类frmClass扩展了无状态小部件{
列出差热分析;
get setState=>null;
Future getData()异步{
var uri='1〕https://xxxx.com/class';
var map=newmap();
映射[“用户名”]=“abc”;
映射[“密码”]=“1234”;
http.Response-Response=等待http.post(
乌里,
正文:JSONECODE(map),
);
Map mp=jsonDecode(utf8.decode(response.bodyBytes));
此.setState(){
dta=mp[“数据”];
debugPrint(dta.toString());
});
}
@凌驾
void initState(){
这是getData();
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(
背景颜色:颜色。透明,
标高:0.0,
iconTheme:new IconThemeData(颜色:颜色(0xFF18D191)),
正文:新建ListView.builder(
itemCount:dta==null?0:dta.length,
itemBuilder:(构建上下文,int索引){
归还新卡(
子项:新文本(dta[索引][“类名]),
);
}
),
);
}
}
如何修复它?之所以发生这种情况,是因为无状态小部件没有initState
,这就是为什么永远不会调用下面的代码。无状态小部件更像是一种没有生命周期方法的呈现平面UI,如果您想使用无状态小部件,那么就在类构造函数中传递数据,并在任何需要的地方使用它
@override
void initState(){
this.getData();
}
之所以会发生这种情况,是因为无状态小部件没有initState
,这就是为什么永远不会调用下面的代码。无状态小部件更像是一种没有生命周期方法的呈现平面UI,如果您想使用无状态小部件,那么就在类构造函数中传递数据,并在任何需要的地方使用它
@override
void initState(){
this.getData();
}
您可以使用FutureBuilder将getData()调用到无状态Widget的build()方法中:
但是,每次重建无状态小部件时,都会触发getData()
另一种方法是使用反应式编程体系结构(如Bloc、rxdart等)
根据需要,每次或仅一次(或当您的条件为真/假时)激发getData()。您可以使用FutureBuilder将getData()调用到无状态Widget的build()方法中:
但是,每次重建无状态小部件时,都会触发getData()
另一种方法是使用反应式编程体系结构(如Bloc、rxdart等)
取决于您想要什么,每次或仅一次(或当您的条件为true/false时)激发getData()。这是因为,无状态Widget没有initState()。是否关心为什么不使用有状态?这是因为,无状态Widget没有initState()。是否关心为什么不使用有状态?我如何调用getData()?我不熟悉flutter:-)在您的情况下应该使用有状态小部件,其他小部件的解决方法不正确,我如何调用getData()?我是新来的:在你的情况下,你应该使用有状态的小部件,其他小部件不是正确的解决方法