Flutter 颤振:如何在无状态小部件中调用函数?

Flutter 颤振:如何在无状态小部件中调用函数?,flutter,Flutter,我想用列表视图和JSON显示数据列表。此代码位于带有无状态小部件的文件中。并在登录后打开此页面。当我在有状态小部件中尝试时,代码正常运行。在无状态小部件中,当我调试它时,代码没有调用函数getData()。但是直接去了 Widget build(BuildContext context) { return new Scaffold( ... 以下是完整的代码: class frmClass extends StatelessWidget{ List<dynamic

我想用列表视图和JSON显示数据列表。此代码位于带有
无状态小部件的文件中。并在登录后打开此页面。当我在有状态小部件中尝试时,代码正常运行。在无状态小部件中,当我调试它时,代码没有调用函数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()?我是新来的:在你的情况下,你应该使用有状态的小部件,其他小部件不是正确的解决方法