اذهب إلى المحتوى
  • 0

حل مشكلة Flutter Unhandled Exception: FormatException: Unexpected character

السؤال

نشر (معدل)

تحيه طيبه للجميع

اقوم بالاستعلام عن بيانات في قاعدة البيانات نوع mysql من خلال الاتصال من فلاتر الى ملف php وجلب البيانات 

في حالة وجود بيانات الكود شغال 100%100 بدون ان تظهر رسالة الخطاء هذا ولكن في حالة عدم توفر بيانات في الجدول البيانات  احصل على الخطاء التالي :

E/flutter (19611): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: FormatException: Unexpected character (at character 1)
E/flutter (19611): <br />
E/flutter (19611): ^
E/flutter (19611): 
E/flutter (19611): #0      _ChunkedJsonParser.fail (dart:convert-patch/convert_patch.dart:1404:5)
E/flutter (19611): #1      _ChunkedJsonParser.parseNumber (dart:convert-patch/convert_patch.dart:1271:9)
E/flutter (19611): #2      _ChunkedJsonParser.parse (dart:convert-patch/convert_patch.dart:936:22)
E/flutter (19611): #3      _parseJson (dart:convert-patch/convert_patch.dart:40:10)
E/flutter (19611): #4      JsonDecoder.convert (dart:convert/json.dart:506:36)
E/flutter (19611): #5      JsonCodec.decode (dart:convert/json.dart:157:41)
E/flutter (19611): #6      _HomePageState.fetchNotes (package:testapp/Your.dart:115:38)
E/flutter (19611): <asynchronous suspension>
E/flutter (19611): #7      _HomePageState.initState.<anonymous closure> (package:testapp/Your.dart)
E/flutter (19611): <asynchronous suspension>
E/flutter (19611): 

 

 

الكود المستعمل للاستعلام:

  Future<List<Data>> fetchNotes() async {
    final String url = 'https://***************.php?id=' + id.toString();
    var response = await http.post(Uri.parse(url));
    var flowers = List<Data>();
    if (response.statusCode == 200) {

        final flowersJsonData = json.decode(response.body).cast<Map<String, dynamic>>();
        for (var flower in flowersJsonData) {
          flowers.add(Data.fromJson(flower));
        }

    }
    else {
      throw Exception('Failed to load data from Server.');
    }
    return flowers;
  }

 

 

php file:

<?php


include 'con.php';

  $id=$_GET['id'];



$sql = "SELECT * FROM user WHERE id=?";

$stmt = $con->prepare($sql); 

$stmt->bind_param("s",$id);

$stmt->execute();

$result = $stmt->get_result();

 
if ($result) {
 
 
	 while($row[] = $result->fetch_assoc()) {
	 
	 $item = $row;
	 
	 $json = json_encode($item, JSON_NUMERIC_CHECK);
	 
	 }
 
} else {
  
   echo "No Data Found.";
}
 echo $json;
$con->close();

?>

 

 

ياليت اذا احد لديه فكره عن حل للمشكله يفيدنا

شكرا لكم

تم التعديل في بواسطة Wael Aljamal
توضيح السؤال

Recommended Posts

  • 1
نشر

الخطأ Unhandled Exception: FormatException: Unexpected character يشير أن البيانات المستقبلة ليست بالتنسيق المطلوب

إن حصولك على response.statusCode == 200 لايعني وجود بيانات، إنما إكمال الاتصال بشكل صحيح.لاحظ أنه عند جلب بيانات المستخدم يكون تنسيقها JSON وعند الفشل تكون نص عادي.. هذا الاختلاف يجب التعامل معه بشكل جيدة

json.decode ضمن شيفرة Flutter يتعامل مع ناتج الرد والذي يعمل بشكل صحيح إن أرسل البيانات بشكل json_encode

ولاحظ في شيفرتك، إن لم يتم جلب بيانات المستخدم، سوف ترسل ردين للهاتف في else وآخر عبارة echo

if ($result) {
 
 
	 while($row[] = $result->fetch_assoc()) {
	 
	 $item = $row;
	 
	 $json = json_encode($item, JSON_NUMERIC_CHECK);
	 
	 }
 
} else {
  
   echo "No Data Found."; // لايوجد مستخدم
}
 echo $json;   /// سوف تعمل على كل حال

لاختصار المشكلة، سوف نعيد رد وحيد للتطبيق:

    $data = array();
    $result = $con->query($sql);

    while($row = $result->fetch_assoc()) {
        $data[] = $row;
    }

    echo json_encode($data);

سيصبح تحويل البيانات كهذا:

<?php

$json = [];
$result = $stmt->get_result();
if ($result) {
    while ($row = $result->fetch_assoc()) {
        $json[] = $row;
    }
}
echo json_encode($json, JSON_NUMERIC_CHECK);
$con->close();

json_encod ستعمل مرة واحدة مهما كانت القيمة المخزنة في json$ حتى لو فارغة ستعيد كائن فارغ له تنسيق json وهذا لن يسبب خطأ

الآن اكمل معالجة الموضوع في Flutter حيث أن القائمة flowersJsonData ستكون فارغة.. مما يرد flowers فارغة 

أي ضمن جزء العرض، اجعل الواجهة تعرض "مستخدم غير معرف مثلا" أو أي شيئ يدل على عدم وجود هذا المستخدم

  • 0
نشر (معدل)


تعديل على سوالي الثاني :  تم الحل اخي الكريم شكرا لك وللفائده كالتالي :

المشكله كانت بعد تعديل بطريقةالمشار اليها في الاعلى من الاخ @Wael Aljamal كل الشكر لك اخي الكريم.

نحن في حاجة الى اظهار نص او صورة للمستخدم في حالة كانت القائمة فارغة و طريقة الحل كانت بتحقق من القائمة في البداية 

مثال على الحل منقول:

Widget getTasListView() {
        return arrList.isNotEmpty
            ? ListView.builder(
                itemCount: arrList.length,
                itemBuilder: (BuildContext context, int position) {
                  return Card(
                    color: Colors.white,
                    elevation: 2.0,
                    child: Column(
                      children: <Widget>[
                        ListTile(
                          title: Text(this.list[position].task),
                          onLongPress: () =>
                              navigateToDetail(this.list[position], 'Edit Task'),
                        )
                      ],
                    ),
                  );
                })
            : Center(child: Image.asset("path/image/img.png"));
      }

هنا تم التحقق في البداية اذا كانت ليست فارغة وفي حالة انها فارغة تظهر صورة للمستخدم

تم التعديل في بواسطة مروان مروان3

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...