【问题标题】:the "data" value in setstate of else part in "filterSearchResults" is getting empty value“filterSearchResults”中 else 部分的 setstate 中的“data”值变为空值
【发布时间】:2020-03-23 17:05:11
【问题描述】:

“filterSearchResults”中else部分的setstate中的“data”值变为空值。数据值是我从上一页传递的。

我在变量数据中得到一个空值作为“filterSearchResults”函数中 else 部分的 setstate。

import 'package:flutter/material.dart';

class Country extends StatefulWidget {
  final List data;

  Country(this.data);

  @override
  _CountryState createState() => _CountryState(this.data);
}

class _CountryState extends State<Country> {
  TextEditingController editingController = TextEditingController();
  List data;
  _CountryState(this.data);

  List data1;

//  search function

  void filterSearchResults(String query) {
    List<dynamic> dummySearchList = List<dynamic>();

    List<dynamic> dummyList = List<dynamic>();
    dummySearchList.addAll(data1);
    print("dummy sreach List : $dummySearchList");

    if (query.isNotEmpty) {
      for (var i = 0; i < data1.length; i++) {
        var keys = data1[i].keys.toList();

        var val = data1[i][keys[0]];

        print("val is: ${val.toLowerCase()}");

        if (val.toLowerCase().contains((query.toLowerCase()))) {
          dummyList.add(data1[i]);

          print("dummy list is : $dummyList");
        }
      }
      setState(() {
        print("if set");
        data1.clear();
        data1 = dummyList;
        print("data1 : $data1");
      });

      return;
    } else {
      print("else started");
      setState(() {
        data1.clear();
        print("CLEAR DATA : $data1");
        print('original data: $data'); 
        data1 = data;                     //this is where the problem is.. 
        print('else data1: $data1');
        print("else ended");
      });
    }
  }

  void setData1() {
    setState(() {
      this.data1 = data;
      print("set data : $data");
    });
  }

  @override
  void initState() {
    super.initState();
    setData1();
    print("init state started");
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Covid 19"),
      ),
      body: Container(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextField(
              controller: editingController,
              decoration: InputDecoration(
                  labelText: "Search",
                  hintText: "Search",
                  prefixIcon: Icon(Icons.search),
                  border: OutlineInputBorder(
                      borderRadius: BorderRadius.all(Radius.circular(25.0)))),
              onChanged: (value) {
                filterSearchResults(value);
              },
            ),
            Expanded(
              child: ListView.builder(
                itemCount: data1.length,
                shrinkWrap: true,
                itemBuilder: (context, index) {
                  Padding(padding: EdgeInsets.fromLTRB(8, 5, 8, 5));
                  return Card(
                    elevation: 5,
                    child: Container(
                      height: 200,
                      width: MediaQuery.of(context).size.width,
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.start,
                        children: <Widget>[
                          Padding(
                            padding: EdgeInsets.only(top: 10),
                          ),
                          Text(
                            data1[index]['country'],
                            style: TextStyle(fontSize: 30, color: Colors.black),
                          ),
                          Padding(
                            padding: EdgeInsets.only(top: 20),
                          ),
                          Row(
                            children: <Widget>[
                              Expanded(
                                child: Column(
                                  mainAxisAlignment: MainAxisAlignment.start,
                                  children: <Widget>[
                                    Text(
                                      "Cases",
                                      style: TextStyle(
                                          fontSize: 15, color: Colors.black),
                                    ),
                                    Text(
                                      data1[index]["cases"].toString(),
                                      style: TextStyle(
                                          fontSize: 15, color: Colors.black),
                                    ),
                                    Padding(
                                      padding: EdgeInsets.only(top: 25),
                                    ),
                                    Text(
                                      "TodayCases",
                                      style: TextStyle(
                                          fontSize: 15, color: Colors.black),
                                    ),
                                    Text(
                                      data1[index]["todayCases"].toString(),
                                      style: TextStyle(
                                          fontSize: 15, color: Colors.black),
                                    ),
                                  ],
                                ),
                              ),
                              Expanded(
                                child: Column(
                                  mainAxisAlignment: MainAxisAlignment.start,
                                  children: <Widget>[
                                    Text(
                                      "Deaths",
                                      style: TextStyle(
                                          fontSize: 15, color: Colors.black),
                                    ),
                                    Text(
                                      data1[index]["deaths"].toString(),
                                      style: TextStyle(
                                          fontSize: 15, color: Colors.black),
                                    ),
                                    Padding(
                                      padding: EdgeInsets.only(top: 25),
                                    ),
                                    Text(
                                      "TodayDeaths",
                                      style: TextStyle(
                                          fontSize: 15, color: Colors.black),
                                    ),
                                    Text(
                                      data1[index]["todayDeaths"].toString(),
                                      style: TextStyle(
                                          fontSize: 15, color: Colors.black),
                                    ),
                                  ],
                                ),
                              ),
                              Expanded(
                                child: Column(
                                  mainAxisAlignment: MainAxisAlignment.start,
                                  children: <Widget>[
                                    Text(
                                      "Active",
                                      style: TextStyle(
                                          fontSize: 15, color: Colors.black),
                                    ),
                                    Text(
                                      data1[index]["active"].toString(),
                                      style: TextStyle(
                                          fontSize: 15, color: Colors.black),
                                    ),
                                    Padding(
                                      padding: EdgeInsets.only(top: 25),
                                    ),
                                    Text(
                                      "Recovered",
                                      style: TextStyle(
                                          fontSize: 15, color: Colors.black),
                                    ),
                                    Text(
                                      data1[index]["recovered"].toString(),
                                      style: TextStyle(
                                          fontSize: 15, color: Colors.black),
                                    ),
                                  ],
                                ),
                              ),
                              Expanded(
                                child: Column(
                                  mainAxisAlignment: MainAxisAlignment.start,
                                  children: <Widget>[
                                    Text(
                                      "Critical",
                                      style: TextStyle(
                                          fontSize: 15, color: Colors.black),
                                    ),
                                    Text(
                                      data1[index]["critical"].toString(),
                                      style: TextStyle(
                                          fontSize: 15, color: Colors.black),
                                    ),
                                    Padding(
                                      padding: EdgeInsets.only(top: 25),
                                    ),
                                    Text(
                                      "PerOneMillion",
                                      style: TextStyle(
                                          fontSize: 15, color: Colors.black),
                                    ),
                                    Text(
                                      data1[index]["casesPerOneMillion"]
                                          .toString(),
                                      style: TextStyle(
                                          fontSize: 15, color: Colors.black),
                                    ),
                                  ],
                                ),
                              ),
                            ],
                          ),
                        ],
                      ),
                    ),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您必须从widget 字段访问您的data 字段:this.widget.data。通过State 传递数据不会被更新。见Passing Data to a Stateful Widget

    尝试将 StatefulWidget 更改为:

    class Country extends StatefulWidget {
      final List data;
      const Country ({Key key, this.data}): super(key: key);
    
      @override
      _CountryState createState() => _CountryState();
    }
    
    class _CountryState extends State<Country> {
      TextEditingController editingController = TextEditingController();
    
      List data1;
      ...
    

    在您的 else 部分,您必须通过 widget.data 访问数据变量

    else {
      print("else started");
      setState(() {
        data1.clear();
        print("CLEAR DATA : $data1");
        print('original data: $widget.data');
        data1 = widget.data; //this is where the problem (hopefully) were..
        print('else data1: $data1');
        print("else ended");
    }
    

    【讨论】:

    • 感谢您的回复,我也尝试过这种方法,但仍然 widget.data 在 data1 = widget.data; 处返回空值; //这就是问题所在.. 颤振:否则开始颤振:清除数据:[]颤振:原始数据:[]颤振:否则数据1:[]颤振:否则结束
    • 我想在 data1 = widget.data; 处访问 widget.data 的原始值; //这就是问题所在(希望如此)..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多