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

type 'int' is not a subtype of type 'String' Flutter

السؤال

نشر

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

كنت أقوم بعملية تطبيق تقسيم القائمة  Lazy Loading ولكن واجهتني مشكلة لم اجد حل لها 

لو قمت بتشغيل التطبيق سيقوم التطبيق بتحميل الصفحة الأولى حسب العدد الذي قمت بتحديده مسبقا من خلال Lazy Loading وليكن 15 مستخدم او 15 اسم 

ولكن لو حاولت الانتقال الى الجزء التالي من القائمة وهيا ال 15 التالي سوف احصل على الخطاء التالي:

type 'int' is not a subtype of type 'String'

قمت بمحاولة وضع toString كالتالي:

ListTile(title: Text((users[index]['name'].toString()))) ;

ولكن المشكلة في هذا الحالة يتم تحميل القائمة كاملة ولا يتم تقسيمها بمعنى خاصية Lazy Loading لا تعمل في هذا الحالة

 

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

class HomeState extends State<Home> {
  static int page = 0;
  ScrollController _sc = new ScrollController();
  bool isLoading = false;
  List users = [];

  @override
  void initState() {
    this._getMoreData();
    super.initState();
    _sc.addListener(() {
      if (_sc.position.pixels == _sc.position.maxScrollExtent) {
        _getMoreData();
      }
    });
  }

  @override
  void dispose() {
    _sc.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text("Lazy Load Large List"),
        ),
        body: Container(
          child: _buildList(),
        ),
        resizeToAvoidBottomInset: false,
      ),
    );
  }


  Widget _buildList() {
    return ListView.builder(
      itemCount: users.length + 1,

      padding: EdgeInsets.symmetric(vertical: 8.0),
      itemBuilder: (BuildContext context, int index) {
        if (index == users.length) {
          return _buildProgressIndicator();
        } else {
          return ListTile(title: Text((users[index]['name']))) ;

        }
      },
      controller: _sc,
    );
  }


  final int _limit = 15;
  Future _getMoreData() async {
    if (!isLoading) {
      setState(() {
        isLoading = true;
      });

      final String url = "*********************.php?=" + "&results=$_limit";
      final response = await http.get(Uri.parse(url));

      print(url);

      List tList = [];
      var responsebody = jsonDecode(response.body);
      for (int i = 0; i < responsebody.length; i++) {
        tList.add(responsebody[i]);
        print(tList);

      }
      setState(() {
        isLoading = false;
        users.addAll(tList);
        page++;
      });
    }
  }

  Widget _buildProgressIndicator() {
    return new Padding(
      padding: const EdgeInsets.all(8.0),
      child: new Center(
        child: new Opacity(
          opacity: isLoading ? 1.0 : 00,
          child: new CircularProgressIndicator(),
        ),
      ),
    );
  }
}

 

 

هل يوجد حل لهذا المشكلة ؟

Recommended Posts

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

إن Text widget تقبل معامل القيمة من نوع ?String

حاول طباعة:


print(users)

print(users[index]['name'])

على الأغلب المشكلة في index 

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

في الحقيقة انا لم اكن مخطي في العمل ولكن لم اكتشف ذلك الا بعد مجهود يوم كامل ساقوم بشرح المشكلة للفائدة

المشكلة كالتالي:

لدي  عمود يحتوي على كل من الاسم نص + ارقام 

لو عملت الكود بشكل أعلاه بدون إضافة تحويل الى نص او tostring  سيعمل اول صفحة ثم يتوقف مع الصفحة الثانية بسب وجود الأرقام مع النصوص ولو قمت بإضافة tostring  احصل على القائمة كامل بدون استقطاع كنت أتوقع ان هذا الامر خطاء ولكن في الحقيقة هو صحيح فقد كان يجلب النصوص + الارقام وهذا الامر صحيح من خلال السطر التالي:

ListTile(title: Text((users[index]['name'].toString()))) ;

السطر هذا صحيح الان ولكن المشكلة المتبقية في السطر التالي:

 

final String url = "*********************.php?=" + "&results=$_limit";

السطر هذا  يحتوي على URL  بالإضافة الى  limit وهو الذي نستطيع من خلاله تحديد كمية الاقتصاص المشكلة تكمن هنا في الكلمة  "&results= اذا لم تكن الكلمة صحيحه لا يتم الاقتصاص 

 

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

انا اجلب البيانات من خلال ملف php التالي لا اعلم اذا كان من المفترض ان تكون من خلاله 

<?php


include 'con.php';



$sql = "SELECT  name FROM User ORDER BY id DESC";


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


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

?>

 

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

لسطر هذا  يحتوي على URL  بالإضافة الى  limit وهو الذي نستطيع من خلاله تحديد كمية الاقتصاص المشكلة تكمن هنا في الكلمة  "&results= اذا لم تكن الكلمة صحيحه لا يتم الاقتصاص

علامة & غير ضرورية لأنها توضع بين ثنائيتين مختلفتين. x=1&y=2 أما في حالتك لديك مفتاح وحيد حتى = بعد اشارة الاستفهام غير ضرورية x=1?

 

  • 0
نشر
بتاريخ 7 ساعات قال Wael Aljamal:

علامة & غير ضرورية لأنها توضع بين ثنائيتين مختلفتين. x=1&y=2 أما في حالتك لديك مفتاح وحيد حتى = بعد اشارة الاستفهام غير ضرورية x=1?

 

مرحب اخي الكريم المشكلة ليست في العلامات انا عامل تطبيق على اكثر من نموذج مع اختلاف شكل url كامل ولكن الجميع الكلامه المفتاحيه لتحديد السلسله غلط لدي 

احتاج اعرف كيف يمكنني تحديد هذا keyword 

 

  • 1
نشر
بتاريخ 4 ساعات قال مروان مروان3:

مرحب اخي الكريم المشكلة ليست في العلامات انا عامل تطبيق على اكثر من نموذج مع اختلاف شكل url كامل ولكن الجميع الكلامه المفتاحيه لتحديد السلسله غلط لدي 

احتاج اعرف كيف يمكنني تحديد هذا keyword 

 

أي تفصد قراءة قيمة _limit ؟

تتعلق قيمتها بالمفتاح results ونجلبه في PHP حسب نوع الطلب ولديك http.get 

<?php

$limit = $_GET['results'];


include 'con.php';

..

 

اكتب url

final String url = "*********************.php?results=$_limit";

 

  • 0
نشر
بتاريخ 6 ساعات قال Wael Aljamal:

أي تفصد قراءة قيمة _limit ؟

تتعلق قيمتها بالمفتاح results ونجلبه في PHP حسب نوع الطلب ولديك http.get 


<?php

$limit = $_GET['results'];


include 'con.php';

..

 

اكتب url


final String url = "*********************.php?results=$_limit";

 

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

نعم الان فهمت الامر وكلامك صحيح 100% انا لم اكن اعلم بوجود القواعد الثابتة limit and offset هذا اول مره اتعامل معهم لذلك كنت تائه اعتذر على ذلك 

كل الشكر لك اخوي

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...