发生异常。 _TypeError(类型'List '不是类型'Map ')的子类型,>>> 我对getruangfasiliti方法有疑问。有什么办法可以解决此错误?我已经工作了好几个星期了。 尝试过,但这不是我想要的。我想获取对象的所有数据 Future<List> getruangfasiliti() async { final response = await http.get(BaseUrl.lihatruangfasiliti(widget.barcode)); return jsonDecode(response.body); } 因此,以下是我的代码以及如何解决该错误。我不知道我的错在哪里 modelAduan.dart class Aduan { final String aduan_id; final String tarikhaduan; final String ruang_id; final String fasiliti_id; final String maklumat; final String gambaraduan; final String status; final String idpengguna; final String namaruang; final String namafasiliti; Aduan({ this.aduan_id, this.tarikhaduan, this.ruang_id, this.fasiliti_id, this.maklumat, this.gambaraduan, this.status, this.idpengguna, this.namaruang, this.namafasiliti }); factory Aduan.fromJson(Map<String, dynamic> json) { return Aduan( aduan_id: json['aduan_id'], tarikhaduan: json['tarikhaduan'], ruang_id: json['ruang_id'], fasiliti_id: json['fasiliti_id'], maklumat: json['maklumat'], gambaraduan: json['gambaraduan'], status: json['status'], idpengguna: json['idpengguna'], namaruang: json['namaruang'], namafasiliti: json['namafasiliti'], ); } } aduan.dart import 'dart:convert'; import 'package:eaduanfsktm/api.dart'; import 'package:eaduanfsktm/sejarahaduan.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:http/http.dart' as http; import 'package:eaduanfsktm/model/modelRuangFasiliti.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'dart:io'; import 'package:image_picker/image_picker.dart'; import 'dart:math' as Math; import 'package:image/image.dart' as Img; import 'package:path_provider/path_provider.dart'; import 'dart:async'; import 'package:async/async.dart'; import 'package:path/path.dart'; class BorangAduan extends StatefulWidget { final String idpengguna, barcode; BorangAduan(this.idpengguna, this.barcode); @override _BorangAduanState createState() => _BorangAduanState(); } class _BorangAduanState extends State<BorangAduan> { final _key = new GlobalKey<FormState>(); final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>(); RuangFasiliti ruangfasiliti; TextEditingController controllerruang_id; TextEditingController controllerfasiliti_id; TextEditingController controller_namaruang; TextEditingController controller_namafasiliti; TextEditingController controllermaklumat = new TextEditingController(); File _image; Future<RuangFasiliti> getruangfasiliti() async { final response = await http.get(BaseUrl.lihatruangfasiliti(widget.barcode)); if (response.statusCode == 200) { setState(() { ruangfasiliti = RuangFasiliti.fromJson(jsonDecode(response.body)); }); setState(() { controllerruang_id = new TextEditingController(text: "${ruangfasiliti.ruang_id}"); controllerfasiliti_id = new TextEditingController(text: "${ruangfasiliti.fasiliti_id}"); controller_namaruang = new TextEditingController(text: " ${ruangfasiliti.namaruang}"); controller_namafasiliti = new TextEditingController(text: " ${ruangfasiliti.namafasiliti}"); }); return ruangfasiliti; } } // @override // void dispose() { // controllerruang_id.dispose(); // controllerfasiliti_id.dispose(); // controller_namaruang.dispose(); // controllerruang_id.dispose(); // controller_namafasiliti.dispose(); // super.dispose(); // } @override void initState() { getruangfasiliti(); super.initState(); } @override Widget build(BuildContext context) { return SafeArea( child: Scaffold( key: _scaffoldKey, appBar: AppBar( title: Text("Borang Aduan"), ), body: ListView( padding: EdgeInsets.all(2.0), children: <Widget>[ FutureBuilder<RuangFasiliti>( future: getruangfasiliti(), builder: (context, snapshot) { if (snapshot.hasData) { return aduanbox(); } else if (snapshot.hasError) { return Text("${snapshot.error}"); } return Center(child: CircularProgressIndicator()); }, ), SizedBox(height: 10.0), ], ), ), ); } Widget aduanbox() { return Center( child: Form( key: _key, child: Card( child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: <Widget>[ new Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: <Widget>[ Expanded( child: Container( child: new TextFormField( controller: controllerfasiliti_id, readOnly: true, decoration: InputDecoration( labelText: "KOD FASILITI", ), ), ), flex: 2, ), SizedBox(width: 10.0), Expanded( child: Container( child: new TextFormField( controller: controller_namafasiliti, readOnly: true, decoration: InputDecoration( labelText: "NAMA FASILITI", ), ), ), flex: 2, ), ], ), new Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: <Widget>[ Expanded( child: Container( child: new TextFormField( controller: controllerruang_id, readOnly: true, decoration: InputDecoration( labelText: "KOD LOKASI", ), ), ), flex: 2, ), SizedBox(width: 10.0), Expanded( child: Container( child: new TextFormField( controller: controller_namaruang, readOnly: true, decoration: InputDecoration( labelText: "LOKASI", ), ), ), flex: 2, ), ], ), TextFormField( controller: controllermaklumat, validator: (value) { if (value.isEmpty) { return 'Masukkan Maklumat Kerosakan'; } return null; }, decoration: InputDecoration( labelText: "MAKLUMAT", hintText: "Masukkan maklumat kerosakan"), ), SizedBox(height: 10.0), Row( children: <Widget>[ RaisedButton( child: Icon(Icons.image), onPressed: getImageGallery, ), SizedBox(width: 5.0), RaisedButton( child: Icon(Icons.camera_alt), onPressed: getImageCamera, ), ], ), SizedBox(height: 10.0), Container( alignment: Alignment.centerLeft, child: _image == null ? new Text("Tiada imej !") : new Image.file(_image), ), SizedBox(height: 10.0), Container( height: 45.0, child: GestureDetector( onTap: () { if (_key.currentState.validate()) { tambahaduan(_image); } }, child: Material( borderRadius: BorderRadius.circular(10.0), color: Colors.blueAccent, elevation: 7.0, child: Center( child: Text( 'HANTAR', style: TextStyle( color: Colors.white, fontWeight: FontWeight.bold, fontFamily: 'Montserrat'), ), ), ), ), ), ], ), ), ), ), ); } Future getImageGallery() async { var imageFile = await ImagePicker.pickImage(source: ImageSource.gallery); final tempDir = await getTemporaryDirectory(); final path = tempDir.path; int rand = new Math.Random().nextInt(100000); Img.Image image = Img.decodeImage(imageFile.readAsBytesSync()); Img.Image smallerImg = Img.copyResize(image, width: 500); var compressImg = new File("$path/image_$rand.jpg") ..writeAsBytesSync(Img.encodeJpg(smallerImg, quality: 85)); setState(() { _image = compressImg; }); } Future getImageCamera() async { var imageFile = await ImagePicker.pickImage(source: ImageSource.camera); final tempDir = await getTemporaryDirectory(); final path = tempDir.path; int rand = new Math.Random().nextInt(100000); Img.Image image = Img.decodeImage(imageFile.readAsBytesSync()); Img.Image smallerImg = Img.copyResize(image, width: 500); var compressImg = new File("$path/image_$rand.jpg") ..writeAsBytesSync(Img.encodeJpg(smallerImg, quality: 85)); setState(() { _image = compressImg; }); } Future tambahaduan(File _image) async { var stream = new http.ByteStream(DelegatingStream.typed(_image.openRead())); var length = await _image.length(); var uri = Uri.parse((BaseUrl.tambahaduan())); var request = new http.MultipartRequest("POST", uri); var multipartFile = new http.MultipartFile("aduanimages", stream, length, filename: basename(_image.path)); request.fields['fasiliti_id'] = controllerfasiliti_id.text; request.fields['ruang_id'] = controllerruang_id.text; request.fields['maklumat'] = controllermaklumat.text; request.fields['idpengguna'] = widget.idpengguna; request.files.add(multipartFile); var response = await request.send(); if (response.statusCode == 200) { print("Image Uploaded"); setState( () { Fluttertoast.showToast( msg: "Aduan Berjaya", toastLength: Toast.LENGTH_LONG, gravity: ToastGravity.CENTER, backgroundColor: Colors.black, textColor: Colors.white, fontSize: 18.0, ); Navigator.of(this.context).push(CupertinoPageRoute( builder: (BuildContext context) => SejarahAduan())); }, ); } else { print("Upload Failed"); } response.stream.transform(utf8.decoder).listen((value) { print(value); }); } } this is my error 我对getruangfasiliti方法有疑问。有什么办法可以解决此错误?我已经工作了好几个星期了。试过这个,但这不是我想要的。我想获取对象的每个数据... List<RuangFasiliti> ruangfasiliti; Future<RuangFasiliti> getruangfasiliti() async { final response = await http.get(BaseUrl.lihatruangfasiliti(widget.barcode)); if (response.statusCode == 200) { var body = jsonDecode(response.body); setState(() { if(body is List) //check if it's a List ruangfasiliti = List<RuangFasiliti>.from((map) => RuangFasiliti.fromJson(map)); if(body is Map) //check if it's a Map ruangfasiliti = [RuangFasiliti.fromJson(body)]; controllerruang_id = new TextEditingController(text: "${ruangfasiliti.ruang_id}"); controllerfasiliti_id = new TextEditingController(text: "${ruangfasiliti.fasiliti_id}"); controller_namaruang = new TextEditingController(text: " ${ruangfasiliti.namaruang}"); controller_namafasiliti = new TextEditingController(text: " ${ruangfasiliti.namafasiliti}"); }); return ruangfasiliti; } } 此代码使您可以保存列表ruangfasiliti,检查解码的json是地图还是列表,然后进行相应保存,但是正如其他注释所述,您应该提供并检查JSON文件的格式,以避免这种类型问题。如果您的JSON总是返回一个列表,那么只需创建一个List主体变量而不检查对象的类型就很容易了

问题描述 投票:0回答:1

我对getruangfasiliti方法有疑问。有什么办法可以解决此错误?我已经工作了好几个星期了。

尝试过,但这不是我想要的。我想获取对象的所有数据

 Future<List> getruangfasiliti() async {
    final response = await http.get(BaseUrl.lihatruangfasiliti(widget.barcode));
    return jsonDecode(response.body);
  }

因此,以下是我的代码以及如何解决该错误。我不知道我的错在哪里

modelAduan.dart

class Aduan {
  final String aduan_id;
  final String tarikhaduan;
  final String ruang_id;
  final String fasiliti_id;
  final String maklumat;
  final String gambaraduan;
  final String status;
  final String idpengguna;
  final String namaruang;
  final String namafasiliti;

  Aduan({
    this.aduan_id,
    this.tarikhaduan,
    this.ruang_id,
    this.fasiliti_id,
    this.maklumat,
    this.gambaraduan,
    this.status,
    this.idpengguna,
    this.namaruang,
    this.namafasiliti
  });

  factory Aduan.fromJson(Map<String, dynamic> json) {
    return Aduan(
      aduan_id: json['aduan_id'],
      tarikhaduan: json['tarikhaduan'],
      ruang_id: json['ruang_id'],
      fasiliti_id: json['fasiliti_id'],
      maklumat: json['maklumat'],
      gambaraduan: json['gambaraduan'],
      status: json['status'],
      idpengguna: json['idpengguna'],
      namaruang: json['namaruang'],
      namafasiliti: json['namafasiliti'],
    );
  }
}

aduan.dart

import 'dart:convert';
import 'package:eaduanfsktm/api.dart';
import 'package:eaduanfsktm/sejarahaduan.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart' as http;
import 'package:eaduanfsktm/model/modelRuangFasiliti.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'dart:io';
import 'package:image_picker/image_picker.dart';
import 'dart:math' as Math;
import 'package:image/image.dart' as Img;
import 'package:path_provider/path_provider.dart';
import 'dart:async';
import 'package:async/async.dart';
import 'package:path/path.dart';

class BorangAduan extends StatefulWidget {
  final String idpengguna, barcode;
  BorangAduan(this.idpengguna, this.barcode);
  @override
  _BorangAduanState createState() => _BorangAduanState();
}

class _BorangAduanState extends State<BorangAduan> {
  final _key = new GlobalKey<FormState>();
  final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();

  RuangFasiliti ruangfasiliti;

  TextEditingController controllerruang_id;
  TextEditingController controllerfasiliti_id;
  TextEditingController controller_namaruang;
  TextEditingController controller_namafasiliti;
  TextEditingController controllermaklumat = new TextEditingController();

  File _image;

  Future<RuangFasiliti> getruangfasiliti() async {
    final response = await http.get(BaseUrl.lihatruangfasiliti(widget.barcode));
    if (response.statusCode == 200) {
      setState(() {
        ruangfasiliti = RuangFasiliti.fromJson(jsonDecode(response.body));
      });
      setState(() {
        controllerruang_id =
            new TextEditingController(text: "${ruangfasiliti.ruang_id}");
        controllerfasiliti_id =
            new TextEditingController(text: "${ruangfasiliti.fasiliti_id}");
        controller_namaruang =
            new TextEditingController(text: " ${ruangfasiliti.namaruang}");
        controller_namafasiliti =
            new TextEditingController(text: " ${ruangfasiliti.namafasiliti}");
      });

      return ruangfasiliti;
    }
  }

  // @override
  // void dispose() {
  //   controllerruang_id.dispose();
  //   controllerfasiliti_id.dispose();
  //   controller_namaruang.dispose();
  //   controllerruang_id.dispose();
  //   controller_namafasiliti.dispose();
  //   super.dispose();
  // }

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

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        key: _scaffoldKey,
        appBar: AppBar(
          title: Text("Borang Aduan"),
        ),
        body: ListView(
          padding: EdgeInsets.all(2.0),
          children: <Widget>[
            FutureBuilder<RuangFasiliti>(
              future: getruangfasiliti(),
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  return aduanbox();
                } else if (snapshot.hasError) {
                  return Text("${snapshot.error}");
                }
                return Center(child: CircularProgressIndicator());
              },
            ),
            SizedBox(height: 10.0),
          ],
        ),
      ),
    );
  }

  Widget aduanbox() {
    return Center(
      child: Form(
        key: _key,
        child: Card(
          child: Padding(
            padding: const EdgeInsets.all(8.0),
            child: Column(
              children: <Widget>[
                new Row(
                  mainAxisSize: MainAxisSize.max,
                  mainAxisAlignment: MainAxisAlignment.start,
                  children: <Widget>[
                    Expanded(
                      child: Container(
                        child: new TextFormField(
                          controller: controllerfasiliti_id,
                          readOnly: true,
                          decoration: InputDecoration(
                            labelText: "KOD FASILITI",
                          ),
                        ),
                      ),
                      flex: 2,
                    ),
                    SizedBox(width: 10.0),
                    Expanded(
                      child: Container(
                        child: new TextFormField(
                          controller: controller_namafasiliti,
                          readOnly: true,
                          decoration: InputDecoration(
                            labelText: "NAMA FASILITI",
                          ),
                        ),
                      ),
                      flex: 2,
                    ),
                  ],
                ),
                new Row(
                  mainAxisSize: MainAxisSize.max,
                  mainAxisAlignment: MainAxisAlignment.start,
                  children: <Widget>[
                    Expanded(
                      child: Container(
                        child: new TextFormField(
                          controller: controllerruang_id,
                          readOnly: true,
                          decoration: InputDecoration(
                            labelText: "KOD LOKASI",
                          ),
                        ),
                      ),
                      flex: 2,
                    ),
                    SizedBox(width: 10.0),
                    Expanded(
                      child: Container(
                        child: new TextFormField(
                          controller: controller_namaruang,
                          readOnly: true,
                          decoration: InputDecoration(
                            labelText: "LOKASI",
                          ),
                        ),
                      ),
                      flex: 2,
                    ),
                  ],
                ),
                TextFormField(
                  controller: controllermaklumat,
                  validator: (value) {
                    if (value.isEmpty) {
                      return 'Masukkan Maklumat Kerosakan';
                    }
                    return null;
                  },
                  decoration: InputDecoration(
                      labelText: "MAKLUMAT",
                      hintText: "Masukkan maklumat kerosakan"),
                ),
                SizedBox(height: 10.0),
                Row(
                  children: <Widget>[
                    RaisedButton(
                      child: Icon(Icons.image),
                      onPressed: getImageGallery,
                    ),
                    SizedBox(width: 5.0),
                    RaisedButton(
                      child: Icon(Icons.camera_alt),
                      onPressed: getImageCamera,
                    ),
                  ],
                ),
                SizedBox(height: 10.0),
                Container(
                  alignment: Alignment.centerLeft,
                  child: _image == null
                      ? new Text("Tiada imej !")
                      : new Image.file(_image),
                ),
                SizedBox(height: 10.0),
                Container(
                  height: 45.0,
                  child: GestureDetector(
                    onTap: () {
                      if (_key.currentState.validate()) {
                        tambahaduan(_image);
                      }
                    },
                    child: Material(
                      borderRadius: BorderRadius.circular(10.0),
                      color: Colors.blueAccent,
                      elevation: 7.0,
                      child: Center(
                        child: Text(
                          'HANTAR',
                          style: TextStyle(
                              color: Colors.white,
                              fontWeight: FontWeight.bold,
                              fontFamily: 'Montserrat'),
                        ),
                      ),
                    ),
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }

  Future getImageGallery() async {
    var imageFile = await ImagePicker.pickImage(source: ImageSource.gallery);

    final tempDir = await getTemporaryDirectory();
    final path = tempDir.path;

    int rand = new Math.Random().nextInt(100000);

    Img.Image image = Img.decodeImage(imageFile.readAsBytesSync());
    Img.Image smallerImg = Img.copyResize(image, width: 500);

    var compressImg = new File("$path/image_$rand.jpg")
      ..writeAsBytesSync(Img.encodeJpg(smallerImg, quality: 85));

    setState(() {
      _image = compressImg;
    });
  }

  Future getImageCamera() async {
    var imageFile = await ImagePicker.pickImage(source: ImageSource.camera);

    final tempDir = await getTemporaryDirectory();
    final path = tempDir.path;

    int rand = new Math.Random().nextInt(100000);

    Img.Image image = Img.decodeImage(imageFile.readAsBytesSync());
    Img.Image smallerImg = Img.copyResize(image, width: 500);

    var compressImg = new File("$path/image_$rand.jpg")
      ..writeAsBytesSync(Img.encodeJpg(smallerImg, quality: 85));

    setState(() {
      _image = compressImg;
    });
  }

  Future tambahaduan(File _image) async {
    var stream = new http.ByteStream(DelegatingStream.typed(_image.openRead()));
    var length = await _image.length();
    var uri = Uri.parse((BaseUrl.tambahaduan()));

    var request = new http.MultipartRequest("POST", uri);

    var multipartFile = new http.MultipartFile("aduanimages", stream, length,
        filename: basename(_image.path));
    request.fields['fasiliti_id'] = controllerfasiliti_id.text;
    request.fields['ruang_id'] = controllerruang_id.text;
    request.fields['maklumat'] = controllermaklumat.text;
    request.fields['idpengguna'] = widget.idpengguna;
    request.files.add(multipartFile);

    var response = await request.send();

    if (response.statusCode == 200) {
      print("Image Uploaded");
      setState(
        () {
          Fluttertoast.showToast(
            msg: "Aduan Berjaya",
            toastLength: Toast.LENGTH_LONG,
            gravity: ToastGravity.CENTER,
            backgroundColor: Colors.black,
            textColor: Colors.white,
            fontSize: 18.0,
          );
          Navigator.of(this.context).push(CupertinoPageRoute(
              builder: (BuildContext context) => SejarahAduan()));
        },
      );
    } else {
      print("Upload Failed");
    }
    response.stream.transform(utf8.decoder).listen((value) {
      print(value);
    });
  }
}

this is my error

我对getruangfasiliti方法有疑问。有什么办法可以解决此错误?我已经工作了好几个星期了。试过这个,但这不是我想要的。我想获取对象的每个数据...

mysql flutter dart
1个回答
0
投票
List<RuangFasiliti> ruangfasiliti;

Future<RuangFasiliti> getruangfasiliti() async {
    final response = await http.get(BaseUrl.lihatruangfasiliti(widget.barcode));
    if (response.statusCode == 200) {
      var body = jsonDecode(response.body);
      setState(() {
        if(body is List) //check if it's a List
        ruangfasiliti = List<RuangFasiliti>.from((map) => RuangFasiliti.fromJson(map));
        if(body is Map) //check if it's a Map
        ruangfasiliti = [RuangFasiliti.fromJson(body)];
        controllerruang_id =
            new TextEditingController(text: "${ruangfasiliti.ruang_id}");
        controllerfasiliti_id =
            new TextEditingController(text: "${ruangfasiliti.fasiliti_id}");
        controller_namaruang =
            new TextEditingController(text: " ${ruangfasiliti.namaruang}");
        controller_namafasiliti =
            new TextEditingController(text: " ${ruangfasiliti.namafasiliti}");
      });

      return ruangfasiliti;
    }
  }

此代码使您可以保存列表ruangfasiliti,检查解码的json是地图还是列表,然后进行相应保存,但是正如其他注释所述,您应该提供并检查JSON文件的格式,以避免这种类型问题。如果您的JSON总是返回一个列表,那么只需创建一个List主体变量而不检查对象的类型就很容易了

© www.soinside.com 2019 - 2024. All rights reserved.