【问题标题】:value displayed after hot reload but null after click热重载后显示的值,但单击后为空
【发布时间】:2019-06-14 14:22:26
【问题描述】:

我想从 json 中检索数据, 单击(形成另一个文件)后,所有值($tgl、$dokter、$paket 等)都为 null,但是当我热重载(在下面的代码中)时,结果就在那里并且是正确的。

我的代码有什么问题?

class DetilTreatment extends StatefulWidget{
  final String nomtri;
  final String jenis;
  DetilTreatment(this.nomtri,this.jenis);
  @override
    State<StatefulWidget> createState() {
      return DetilTreatmentState();
    }
}

class DetilTreatmentState extends State<DetilTreatment>{
  String urldest='json_detail_rawat_dart.php';
  String tgl,dokter,paket,keterangan;
  List tindakan,terapis;

  @override
  void initState() {
    super.initState();
    loadData();
  }

  void loadData() async { 
    final response = await http.get(remoteURL + urldest + '?nomtri=${widget.nomtri}');
    if (response.statusCode == 200) {
      List<dynamic> isi = jsonDecode(response.body);
      tgl = isi[0]['tgl']; 
      dokter = isi[0]['dokter'];  
      paket = isi[0]['paket'];
      keterangan = isi[0]['keterangan'];
    } else {
      throw Exception('Gagal Ambil Data Perawatan');
    }
  }

  @override
    Widget build(BuildContext context) {
      return new Scaffold(
        backgroundColor: Colors.blue[50],
        appBar: new AppBar(
          title: const Text('Data Riwayat Perawatan'),
        ),
        body: ListView(
          padding: EdgeInsets.all(15.0),
          children: <Widget>[
            // all results are null, but when hot-reload the results displayed !
            Text('Tgl/Jam : $tgl', textAlign: TextAlign.left), 
            Text('Nama Dokter : $dokter', textAlign: TextAlign.left),
            Text('Paket : $paket', textAlign: TextAlign.left),
            Text('Treatment : ', textAlign: TextAlign.left),
            Text('Keterangan : $keterangan', textAlign: TextAlign.left),
          ],
        )
        );
    }
}

【问题讨论】:

    标签: dart flutter hot-reload


    【解决方案1】:

    您需要调用setState() 以使Flutter 在状态更改时重新渲染。

      void loadData() async { 
        final response = await http.get(remoteURL + urldest + '?nomtri=${widget.nomtri}');
        if (response.statusCode == 200) {
          List<dynamic> isi = jsonDecode(response.body);
    
          setState(() {
            tgl = isi[0]['tgl']; 
            dokter = isi[0]['dokter'];  
            paket = isi[0]['paket'];
            keterangan = isi[0]['keterangan'];
          });
        } else {
          throw Exception('Gagal Ambil Data Perawatan');
        }
      }
    

    【讨论】:

    • 是的,它的工作,但我必须从源链接点击 2x
    • "我必须从源链接点击 2x" 抱歉,但我不明白你的意思?什么是“源链接”?
    • 对不起我的英语,我的意思是在我点击另一个文件后显示的小部件。这是代码: onTap: () { Navigator.of(context).push(new MaterialPageRoute( builder: (BuildContext context) { return new DetilTreatment(treatment[index]['nomtri'],treatment[index][ 'jenis']); }, fullscreenDialog: true) ); },所以,首先点击 onTap -> null,第二次点击 -> 正确的值。谢谢你的帮助
    • 我不明白为什么您需要单击两次,除非您遇到另一个答案中提到的错误 satish soni。
    • 我只在构建时添加 CircularProgressIndicator() ,就像下面的@satish soni 回答,它的工作
    【解决方案2】:

    在你的方法中调用 SetState(), 也许你会在构建中得到一个空错误,所以最好添加一个 CircularProgressIndicator,

        bool isLoading=false;
             @override
                  void initState() {
                    super.initState();
                    loadData();
                  }
    
                  void loadData() async { 
                    final response = await http.get(remoteURL + urldest + '?nomtri=${widget.nomtri}');
                    if (response.statusCode == 200) {
                     setState(() {
                tgl = isi[0]['tgl']; 
                dokter = isi[0]['dokter'];  
                paket = isi[0]['paket'];
                keterangan = isi[0]['keterangan'];
                isLoading=true;
              });
                    } else {
                      throw Exception('Gagal Ambil Data Perawatan');
                    }
                  }
    
    Widget build(BuildContext context){
    if(!isLoading)
    {
    return Center(child:CircularProgressIndicator());
    }
    else {retur Container();}
    

    【讨论】:

    • 非常感谢,效果很好!但对不起,我不能点击这个作为有用的答案,因为我的声誉很低:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 2021-04-10
    • 1970-01-01
    • 2023-03-14
    • 2020-12-23
    • 1970-01-01
    • 2016-07-15
    相关资源
    最近更新 更多