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

时间:2020-06-02 06:16:38

标签: flutter

我想用列表视图和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"]),
             );
           }
       ),
     );
  }
}

我该如何解决?

2 个答案:

答案 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()。