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

السؤال

نشر

لدي تطبيق بسيط جداً يحتوي على Column يضم عنصرين Text يحملان قيمة عشوائية من 0 لـ 100 ويوجد أيضاً Button عند الضغط عليها من المفترض تبديل أماكن العناصر  في القائمة.
لا يوجد أي أخطاء أو تحذيرات ! لكن عند الضغط على الButton لا يتم تبديل العناصر كما يجب أن يحدث.
هذا هو الكود الخاص بالتطبيق:

import 'dart:math';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

void main() => runApp(new MaterialApp(home: HomePage()));
class HomePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => HomePageState();
}
class HomePageState extends State<HomePage> {
  List<Widget> tiles = [
    MyRandomWidget(),
    MyRandomWidget(),
  ];
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(child: Column(
        mainAxisSize: MainAxisSize.max,
        crossAxisAlignment: CrossAxisAlignment.center,
        mainAxisAlignment: MainAxisAlignment.center,
          children: tiles
      )),
      floatingActionButton: FloatingActionButton(
          child: Icon(Icons.sentiment_very_satisfied), onPressed: swap),
    );
  }
  swap() {
    setState(() {
      tiles.insert(1, tiles.removeAt(0));
    });
  }
}
class MyRandomWidget extends StatefulWidget {
  @override
  ColorfulTileState createState() => ColorfulTileState();
}
class ColorfulTileState extends State<MyRandomWidget> {
  int myNo;
  @override
  void initState() {
    super.initState();
    myNo = Random().nextInt(100);
  }
  @override
  Widget build(BuildContext context) {
    return Text(myNo.toString());
  }
}

 

Recommended Posts

  • 1
نشر

لو وضعت stateless widgets في الـList واعطيتهم أرقام مباشرة كالتالي:

List<Widget> myList = [ Text(‘1’), Text(‘2’) ];

لسار كل شيء كما تريد لكنك قمت بإستخدام stateful widgets بدون تعيين key لها وبالتالي لن يتم التعرف على التغيير الحاصل في الـList الخاصة بك.
لكن لماذا تم التعرف على هذا التغير عندما تم إستخدام عناصر من نوع stateless ؟
لأن القيمة النصية للعنصر مرتبطة بالعنصر نفسه أي لا يوجد لها حالة كما هو الحال في stateful widgets الذي تحتفظ بالقيمة النصية في الحالة الخاصة بها.
إذاً لحل المشكلة يجب إضافة key فريد لكل العناصر المراد التبديل بينها بحيث يتم التفريق بين تلك العناصر حسب الـkey.
يجب أولا أن نهيئ الـ constructor الخاص بـ MyRandomWidget ليستقبل key ويقوم بتمريره للـsuper:

class MyRandomWidget extends StatefulWidget {
  MyRandomWidget({Key key}) : super(key: key); 
  //….باقي الكود
}

بعد تهيئة الـconstructor نقوم بتمرير UniqueKey (مفتاح فريد يتم توليده عشوائياً ) عند تعريف العناصر في داخل الـList ليصبح الكود كالتالي:

  List<Widget> tiles = [
    MyRandomWidget(key: UniqueKey()), //إضافة معرف فريد للعنصر
    MyRandomWidget(key: UniqueKey()),//إضافة معرف فريد للعنصر
  ];

الآن وبعد إسناد معرف فريد لكل عنصر سيعمل كل شيء على يرام.

مرفق الملف بعد التعديل.
main.dart

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...