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

Unhandled Exception: FormatException: Unexpected character with readAsStringSync flutter

السؤال

نشر

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

أقوم بعرض مجموعة من البيانات من خلال api  الى listview  ثم أقوم بمحاولة تخزين هذا البيانات في اول مره من api  حتى يتم عرضها بشكل اسرع لاحقا  او ثانية محاولة 

ولكن كل ما حاولت اعمل تشغيل لتطبيق احصل على الخطاء التالي:

I/flutter ( 4119): Loading from cache
E/flutter ( 4119): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: FormatException: Unexpected character (at character 3)
E/flutter ( 4119): [{userId: 1, id: 1, title: sunt aut facere repellat provident occaecati exc...
E/flutter ( 4119):   ^
E/flutter ( 4119): 

 

 

الصفحة كامل كالتالي:

void main() {
  runApp( proviedsave());
}

class proviedsave extends StatefulWidget {
  const proviedsave({Key? key}) : super(key: key);

  @override
  _proviedsaveState createState() => _proviedsaveState();
}

class _proviedsaveState extends State<proviedsave> {

  final _baseUrl = 'https://jsonplaceholder.typicode.com/posts';

  @override
 void initState() {
    _firstLoad();

  }

bool _isFirstLoadRunning=false;

   _firstLoad() async {
    setState(() {
      _isFirstLoadRunning = true;
    });

    String fileName = "userdata.json";
    var dir = await getTemporaryDirectory();
    File file = new File(dir.path + "/" + fileName);
    if (file.existsSync()) {
      print("Loading from cache");
      var jsonData = file.readAsStringSync();
      var responsebody = jsonDecode(jsonData);
      return responsebody;

    } else {
      print("Loading from API");
      var response = await http.get(Uri.parse('$_baseUrl'));

      if (response.statusCode == 200) {

        var responsebody = jsonDecode(response.body);

        //save json in local file
        file.writeAsStringSync(responsebody.toString(), flush: true, mode: FileMode.write);

        return responsebody;

      }
    }


    setState(() {
      _isFirstLoadRunning = false;
    });
  }



  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: Scaffold(body: ListView(shrinkWrap: true,scrollDirection: Axis.vertical,children: [
Text('sssssssss'),

      FutureBuilder(
          future: _firstLoad(),
          builder: (context, AsyncSnapshot snapshot) {
            if (snapshot.hasData) {
              return ListView.builder(
                  physics: ScrollPhysics(),
                  scrollDirection: Axis.vertical,
                  shrinkWrap: true,
                  itemCount: snapshot.data.length.clamp(0, 6),
                  itemBuilder: (context, index) {
                    return
                    Card(
                      // elevation: 1,
                      child: Container(
                        padding: EdgeInsets.all(6),
                        child: ListTile(
                          title: Text(snapshot.data[index]['title'].toString()),
                         // subtitle: Text(snapshot.data[index]['body'].toString()),
                        ),
                      ),
                    );
                  }
              );

            } else if (snapshot.hasError) {

              return Center(
                  child: Image.asset(
                    'assets/no_dataa.png',
                    fit: BoxFit.contain,
                    width: 180,
                    height: 180,
                  ));

            }
            // By default, show a loading spinner.
            return _isFirstLoadRunning? SizedBox(
              height: MediaQuery.of(context).size.height / 1.3,
              child: Center(
                child: CircularProgressIndicator(
                  valueColor:
                  new AlwaysStoppedAnimation<Color>(Colors.black),
                ),
              ),
            ):Center(
                child: SizedBox(
                  height: MediaQuery.of(context).size.height / 1.3,
                  child: Image.asset(
                    'assets/EmptyFavorite.png',
                    fit: BoxFit.contain,
                    width: 370,
                    height: 370,
                  ),
                ));
          }
          
      )
    ]),),);
  }
}

 

 

كيف يمكن حل هذا المشكلة هل يوجد احد لديه فكره عن الامر؟

 

Recommended Posts

  • 1
نشر

المشكلة لديك في كتابة البيانات لأول مرة على التخزين المحلي في الملف، يجب كتابة البيانات بصيغة JSON 

أي بدل السطر التالي:

file.writeAsStringSync(responsebody.toString(), flush: true, mode: FileMode.write);
                       ^^^^^^^^^^^^^^^^^^^^^^

سوف يكون:

file.writeAsStringSync(json.encode(responsebody), flush: true, mode: FileMode.write);
                       ^^^^^^^^^^^^^^^^^^^^^^^^^

وللقراءة نعمل التعديل:

data = await json.decode(await file.readAsString());

 

  • 0
نشر (معدل)
بتاريخ 8 دقائق مضت قال Wael Aljamal:

المشكلة لديك في كتابة البيانات لأول مرة على التخزين المحلي في الملف، يجب كتابة البيانات بصيغة JSON 

أي بدل السطر التالي:


file.writeAsStringSync(responsebody.toString(), flush: true, mode: FileMode.write);
                       ^^^^^^^^^^^^^^^^^^^^^^

سوف يكون:


file.writeAsStringSync(json.encode(responsebody), flush: true, mode: FileMode.write);
                       ^^^^^^^^^^^^^^^^^^^^^^^^^

وللقراءة نعمل التعديل:


data = await json.decode(await file.readAsString());

 

اهلا اخي الكريم 

قمت بتعديل ذلك الكود كامل كالتالي الان:




void main() {
  runApp( proviedsave());
}

class proviedsave extends StatefulWidget {
  const proviedsave({Key? key}) : super(key: key);

  @override
  _proviedsaveState createState() => _proviedsaveState();
}

class _proviedsaveState extends State<proviedsave> {

  final _baseUrl = 'https://jsonplaceholder.typicode.com/posts';

  @override
 void initState() {
    _firstLoad();

  }

bool _isFirstLoadRunning=false;

   _firstLoad() async {
    setState(() {
      _isFirstLoadRunning = true;
    });

    String fileName = "userdata.json";
    var dir = await getTemporaryDirectory();
    File file = new File(dir.path + "/" + fileName);
    if (file.existsSync()) {
      print("Loading from cache");
      //var jsonData = file.readAsStringSync();
      var jsonData = await json.encode(await file.readAsString());
      // var responsebody = json.encode(jsonData);
      return jsonData;

    } else {
      print("Loading from API");
      var response = await http.get(Uri.parse('$_baseUrl'));

      if (response.statusCode == 200) {

        var responsebody = jsonDecode(response.body);

        //save json in local file
       // file.writeAsStringSync(responsebody.toString(), flush: true, mode: FileMode.write);
        file.writeAsStringSync(json.encode(responsebody), flush: true, mode: FileMode.write);
        return responsebody;

      }
    }


    setState(() {
      _isFirstLoadRunning = false;
    });
  }



  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: Scaffold(body: ListView(shrinkWrap: true,scrollDirection: Axis.vertical,children: [
Text('sssssssss'),

      FutureBuilder(
          future: _firstLoad(),
          builder: (context, AsyncSnapshot snapshot) {
            if (snapshot.hasData) {
              return ListView.builder(
                  physics: ScrollPhysics(),
                  scrollDirection: Axis.vertical,
                  shrinkWrap: true,
                  itemCount: snapshot.data.length.clamp(0, 6),
                  itemBuilder: (context, index) {
                    return
                    Card(
                      // elevation: 1,
                      child: Container(
                        padding: EdgeInsets.all(6),
                        child: ListTile(
                          title: Text(snapshot.data[index]['title'].toString()),
                         // subtitle: Text(snapshot.data[index]['body'].toString()),
                        ),
                      ),
                    );
                  }
              );

            } else if (snapshot.hasError) {

              return Center(
                  child: Image.asset(
                    'assets/no_dataa.png',
                    fit: BoxFit.contain,
                    width: 180,
                    height: 180,
                  ));

            }
            // By default, show a loading spinner.
            return _isFirstLoadRunning? SizedBox(
              height: MediaQuery.of(context).size.height / 1.3,
              child: Center(
                child: CircularProgressIndicator(
                  valueColor:
                  new AlwaysStoppedAnimation<Color>(Colors.black),
                ),
              ),
            ):Center(
                child: SizedBox(
                  height: MediaQuery.of(context).size.height / 1.3,
                  child: Image.asset(
                    'assets/EmptyFavorite.png',
                    fit: BoxFit.contain,
                    width: 370,
                    height: 370,
                  ),
                ));
          }

      )
    ]),),);
  }
}

ولكن الان احصل على المشكلة التالي:

 

Loading from cache

======== Exception caught by widgets library =======================================================
The following _TypeError was thrown building:
type 'String' is not a subtype of type 'int' of 'index'

 

 

لما أقوم بتحديد موقع الخطاء يظهر في السطر التالي:

ListTile(
                          title: Text(snapshot.data[index]['title'].toString()),

 

تم التعديل في بواسطة مروان مروان3
  • 1
نشر
بتاريخ 20 دقائق مضت قال مروان مروان3:

لما أقوم بتحديد موقع الخطاء يظهر في السطر التالي:

ربما تخزين كامل البيانات تم على شكل مصفوفة، 

جرب التالي:

snapshot.data[0][index]['title'].toString()
            ^^^^^

حاول طباعة المتغير الذي يسبب المشكلة لمعرفة هيكليته و خواصه

print(json.encode(snapshot.data));

print(snapshot.data) 

print(variable.toString())

 

  • 0
نشر
بتاريخ 6 دقائق مضت قال Wael Aljamal:

ربما تخزين كامل البيانات تم على شكل مصفوفة، 

جرب التالي:


snapshot.data[0][index]['title'].toString()
            ^^^^^

حاول طباعة المتغير الذي يسبب المشكلة لمعرفة هيكليته و خواصه


print(json.encode(snapshot.data));

print(snapshot.data) 

print(variable.toString())

 

قمت بأول خيار ولم تحل المشكلة 

بالنسبة الى الطباعة هذا ما احصل عليه:

  itemBuilder: (context, index) {

                    print('2=====================${json.encode(snapshot.data)}');
                    print('1=====================${snapshot.data}');
I/flutter ( 2677): Loading from cache
I/flutter ( 2677): Loading from cache
I/flutter ( 2677): 2====================="\"[{userId: 1, id: 1, title: sunt aut facere repellat provident occaecati excepturi optio reprehenderit, body: quia et suscipit\\nsuscipit recusandae consequuntur expedita et cum\\nreprehenderit molestiae ut ut quas totam\\nnostrum rerum est autem sunt rem eveniet architecto}, {userId: 1, id: 2, title: qui est esse, body: est rerum tempore vitae\\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\\nqui aperiam non debitis possimus qui neque nisi nulla}, {userId: 1, id: 3, title: ea molestias quasi exercitationem repellat qui ipsa sit aut, body: et iusto sed quo iure\\nvoluptatem occaecati omnis eligendi aut ad\\nvoluptatem doloribus vel accusantium quis pariatur\\nmolestiae porro eius odio et labore et velit aut}, {userId: 1, id: 4, title: eum et est occaecati, body: ullam et saepe reiciendis voluptatem adipisci\\nsit amet autem assumenda provident rerum culpa\\nquis hic commodi nesciunt rem tenetur dolore
I/flutter ( 2677): 1====================="[{userId: 1, id: 1, title: sunt aut facere repellat provident occaecati excepturi optio reprehenderit, body: quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto}, {userId: 1, id: 2, title: qui est esse, body: est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla}, {userId: 1, id: 3, title: ea molestias quasi exercitationem repellat qui ipsa sit aut, body: et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut}, {userId: 1, id: 4, title: eum et est occaecati, body: ullam et saepe reiciendis voluptatem adipisci\nsit amet autem assumenda provident rerum culpa\nquis hic commodi nesciunt rem tenetur doloremque ipsam iu

 

  • 1
نشر
بتاريخ 5 دقائق مضت قال مروان مروان3:

بالنسبة الى الطباعة هذا ما احصل عليه:



 

طيب، ممكن عرض التالي:

print(snapshot.data[0])
print(snapshot.data[0]['title'])

لنتأكد أي index يسبب المشكلة

بتاريخ 38 دقائق مضت قال مروان مروان3:

itemCount: snapshot.data.length.clamp(0, 6),

@مروان مروان3تأكد من هذه وهل يعطي index أكبر منها 

لأنها ربما سبب الخروج من المصفوفة

  • 0
نشر
بتاريخ 1 دقيقة مضت قال Wael Aljamal:

طيب، ممكن عرض التالي:


print(snapshot.data[0])
print(snapshot.data[0]['title'])

لنتأكد أي index يسبب المشكلة

مرحبا اخي الكريم تم حل المشكلة اعتمادناًً على اول حل انت شاركته لدي ولكن الفرق فقط انني قمت بوضعه نوع 

jsonDecode

حقيقه انني لست خبير ب موضوع نوع البيانات هذا ولكن الي شفته من خلال عمل الطباعة ان النوع الذي قدمته سابقا يحتوي على كوتيشن او فواصل في بداية المصفوفة وعلى ما يبدو هذا سبب المشكلة قمت بتغير النوع في وقت الحفظ والاستدعاء ايضا لما قمت بحفظ البيانات من نوع json.encode البيانات وقت الاستدعاء تحتوي على // من هذا النوع بين كل كلمة وأخرى بشكل كبير 

وهذا الصفحة كاملة اشاركها للفائدة 


void main() {
  runApp( proviedsave());
}

class proviedsave extends StatefulWidget {
  const proviedsave({Key? key}) : super(key: key);

  @override
  _proviedsaveState createState() => _proviedsaveState();
}

class _proviedsaveState extends State<proviedsave> {

  final _baseUrl = 'https://jsonplaceholder.typicode.com/posts';

  @override
  void initState() {
    _firstLoad();

  }

  bool _isFirstLoadRunning=false;

  _firstLoad() async {
    setState(() {
      _isFirstLoadRunning = true;
    });

    String fileName = "userdata.json";
    var dir = await getTemporaryDirectory();
    File file = new File(dir.path + "/" + fileName);
    if (file.existsSync()) {
      print("Loading from cache");
      //var jsonData = file.readAsStringSync();
      var jsonData = await jsonDecode(await file.readAsString());
      // var responsebody = json.encode(jsonData);

      return jsonData;

    } else {
      print("Loading from API");
      var response = await http.get(Uri.parse('$_baseUrl'));

      if (response.statusCode == 200) {

        var responsebody = jsonDecode(response.body);

        //save json in local file
        // file.writeAsStringSync(responsebody.toString(), flush: true, mode: FileMode.write);
        file.writeAsStringSync(jsonDecode(responsebody), flush: true, mode: FileMode.write);
        return responsebody;

      }
    }


    setState(() {
      _isFirstLoadRunning = false;
    });
  }



  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: Scaffold(body: ListView(shrinkWrap: true,scrollDirection: Axis.vertical,children: [
      Text('sssssssss'),

      FutureBuilder(
          future: _firstLoad(),
          builder: (context, AsyncSnapshot snapshot) {
            if (snapshot.hasData) {
              return ListView.builder(
                  physics: ScrollPhysics(),
                  scrollDirection: Axis.vertical,
                  shrinkWrap: true,
                  itemCount: snapshot.data.length.clamp(0, 6),
                  itemBuilder: (context, index) {

                    print('2=====================${json.encode(snapshot.data)}');
                    print('1=====================${snapshot.data}');


                    return
                      Card(
                        // elevation: 1,
                        child: Container(
                          padding: EdgeInsets.all(6),
                          child: ListTile(
                            title: Text(snapshot.data[index]['title'].toString()),
                            // subtitle: Text(snapshot.data[index]['body'].toString()),
                          ),
                        ),
                      );
                  }
              );

            } else if (snapshot.hasError) {

              return Center(
                  child: Image.asset(
                    'assets/no_dataa.png',
                    fit: BoxFit.contain,
                    width: 180,
                    height: 180,
                  ));

            }
            // By default, show a loading spinner.
            return _isFirstLoadRunning? SizedBox(
              height: MediaQuery.of(context).size.height / 1.3,
              child: Center(
                child: CircularProgressIndicator(
                  valueColor:
                  new AlwaysStoppedAnimation<Color>(Colors.black),
                ),
              ),
            ):Center(
                child: SizedBox(
                  height: MediaQuery.of(context).size.height / 1.3,
                  child: Image.asset(
                    'assets/EmptyFavorite.png',
                    fit: BoxFit.contain,
                    width: 370,
                    height: 370,
                  ),
                ));
          }

      )
    ]),),);
  }
}

الف شكر لك اخي 

فقط احتاج الى معلومة اخيره اخي لو تكرمت

في حالة حدث إضافة او حذف للبيانات في api  او نقول قاعدة البيانات كيف يتم تحديث هذا الملف بالبيانات الجديدة؟ 

@Wael Aljamal

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...