значение, отображаемое после горячей перезагрузки, но нулевое после щелчка - PullRequest
0 голосов
/ 21 января 2019

Я хочу получить данные из json, после щелчка (сформировать другой файл) я получаю нулевое значение для всех значений ($ tgl, $ dokter, $ paket и т. Д.), Но когда я выполняю горячую перезагрузку (с указанными ниже кодами)результаты есть и исправляют.

что не так с моими кодами?

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),
          ],
        )
        );
    }
}

Ответы [ 2 ]

0 голосов
/ 21 января 2019

вызов 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();}
0 голосов
/ 21 января 2019

Вам нужно позвонить 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');
    }
  }
...