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

تفسير عدم حدوث استثناء عند استخدام Column داخل SingleChildScrollView

Mohammed Hhhh

السؤال

السلام عليكم 

لدي سؤال لم اجد له اجابه

السؤال كالتالي : 

الحين احنا بنعرف انه ال Column  widget بتتوسع على حسب المساحه المتبقيه فإذا هي شبيه لل expanded 

و كمان احنا بنعرف انوا  اذا حطينا expanded widget   بداخل singelChildScroollView widget  رح يعطينا exception

ف السؤال ليش لما نحط column widget بداخل singelChildScroollView ما بيعطينا exception مع انه كل منهم(expanded , column) بتتوسع على حسب المساحه المتبقيه 

 

شاهد الصوره --->

 

Screenshot 2023-05-20 at 9.35.06 PM.png

تم التعديل في بواسطة Mustafa Suleiman
تعديل عنوان السؤال
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

عند وضع Column داخل SingleChildScrollView، بإمكان لـ Column أن يتمدد بشكل لا محدود في الاتجاه الرأسي داخل SingleChildScrollView. وبالتالي، لن يتم رمي استثناء عند تمرير المحتوى.

وهناك بعض التناقض في الشروط التي يتم فيها رمي استثناء عند استخدام Expanded داخل SingleChildScrollView. في الواقع، إذا وضعت Expanded داخل SingleChildScrollView، ستحدث استثناءات لأن Expanded يحاول التمدد لاستغلال المساحة المتبقية، في حين يسمح SingleChildScrollView بالتمدد غير المحدود.

ففي حالة وضع Column بداخل SingleChildScrollView، يتم تطبيق تمدد Column على العناصر الموجودة داخلها فقط، وليس على الـ SingleChildScrollView نفسه. ببساطة، SingleChildScrollView يعمل على إظهار المحتوى الذي يتجاوز المساحة المتاحة على الشاشة بواسطة التمرير، في حين يتمدد Column فقط بناءً على المحتوى الذي يحتويه.

وإليك مثالًا بسيطًا يوضح استخدام Column داخل SingleChildScrollView بدون حدوث استثناء:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Example',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Example'),
        ),
        body: SingleChildScrollView(
          child: Column(
            children: [
              Container(
                height: 200, // ارتفاع ثابت للمثال
                color: Colors.blue,
              ),
              Container(
                height: 200,
                color: Colors.green,
              ),
              Container(
                height: 200,
                color: Colors.red,
              ),
              // يمكنك إضافة المزيد من العناصر هنا
            ],
          ),
        ),
      ),
    );
  }
}

تم وضع Column داخل SingleChildScrollView وتحديد ارتفاع ثابت لكل عنصر في Column، بغض النظر عن عدد العناصر، ستظهر جميعها داخل SingleChildScrollView ويمكن التمرير لعرض المحتوى الكامل.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

عند وضع Column widget داخل SingleChildScrollView، فإنه لا يحدث استثناء (exception) لأن SingleChildScrollView يسمح بالتمدد (expansion) غير محدود في الاتجاه الرأسي، بغض النظر عن عدد عناصر Column.

SingleChildScrollView يعمل على إظهار كل عناصر القائمة بطريقة يمكن التمرير (scrollable) حتى وإن كانت أكثر من المساحة المتاحة على الشاشة. وعندما يكون لديك عنصر واحد فقط في SingleChildScrollView، ويمكن لـ Column أن يتمدد (expand) بشكل غير محدود في الاتجاه الرأسي ليتناسب مع حجم محتواه.

أما بالنسبة لاستخدام Expanded داخل SingleChildScrollView، فالمشكلة تكمن في أن Expanded يحاول التمدد بنسبة معينة مقابل المساحة المتبقية، ولكن بسبب وجود SingleChildScrollView الذي يسمح بالتمدد غير المحدود، يكون هناك صراع بين الـ Expanded و SingleChildScrollView في التمدد، وهذا ما يتسبب في رمي استثناء (exception).

وإذا أردت استخدام Column داخل SingleChildScrollView وتجنب الاستثناء، تستطيع استخدام واجهة ConstrainedBox لتحديد حجم ثابت لـ Column، بحيث لا يحاول التمدد بشكل غير مناسب.

مثال للتوضيح:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Example',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Example'),
        ),
        body: SingleChildScrollView(
          child: ConstrainedBox(
            constraints: BoxConstraints(), // قيود خالية، لا تحدد أي قيود على الحجم
            child: Column(
              children: [
                // عناصر القائمة هنا
                // يمكنك وضع قائمة طويلة هنا دون حدوث استثناء
              ],
            ),
          ),
        ),
      ),
    );
  }
}

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 1 ساعة قال Mustafa Suleiman:

عند وضع Column widget داخل SingleChildScrollView، فإنه لا يحدث استثناء (exception) لأن SingleChildScrollView يسمح بالتمدد (expansion) غير محدود في الاتجاه الرأسي، بغض النظر عن عدد عناصر Column.

SingleChildScrollView يعمل على إظهار كل عناصر القائمة بطريقة يمكن التمرير (scrollable) حتى وإن كانت أكثر من المساحة المتاحة على الشاشة. وعندما يكون لديك عنصر واحد فقط في SingleChildScrollView، ويمكن لـ Column أن يتمدد (expand) بشكل غير محدود في الاتجاه الرأسي ليتناسب مع حجم محتواه.

أما بالنسبة لاستخدام Expanded داخل SingleChildScrollView، فالمشكلة تكمن في أن Expanded يحاول التمدد بنسبة معينة مقابل المساحة المتبقية، ولكن بسبب وجود SingleChildScrollView الذي يسمح بالتمدد غير المحدود، يكون هناك صراع بين الـ Expanded و SingleChildScrollView في التمدد، وهذا ما يتسبب في رمي استثناء (exception).

وإذا أردت استخدام Column داخل SingleChildScrollView وتجنب الاستثناء، تستطيع استخدام واجهة ConstrainedBox لتحديد حجم ثابت لـ Column، بحيث لا يحاول التمدد بشكل غير مناسب.

مثال للتوضيح:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Example',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Example'),
        ),
        body: SingleChildScrollView(
          child: ConstrainedBox(
            constraints: BoxConstraints(), // قيود خالية، لا تحدد أي قيود على الحجم
            child: Column(
              children: [
                // عناصر القائمة هنا
                // يمكنك وضع قائمة طويلة هنا دون حدوث استثناء
              ],
            ),
          ),
        ),
      ),
    );
  }
}

 

اخي ممكن توضح اكثر :

انته بتقول انه ال column يتمدد بشكل لا محدود و لا يرمى exception في حال و ضعه داخل SinglScrooll.... و تحت في اخر الاجابه بتقولي كيف اتجنب ال exception هنالك تناقض ممكن توضح اكثر و بالإمثله و شكرا////

تم التعديل في بواسطة Mohammmed Mahmoud
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

التصرف الذي وصفته لا يتسبب في حدوث استثناء (exception) عند وضع Column widget داخل SingleChildScrollView widget، لأنهما يتصرفان بشكل مختلف وفقًا لميكانيكياتهما الخاصة.

 

Column Widget:

  • Column widget يقوم بترتيب العناصر الفرعية عموديًا (عمود واحد)، ويمكن أن يمتد ليشغل المساحة المتبقية الكاملة بالارتفاع.

  • يعني أن عناصر Column ستتوسع لتملأ المساحة العمودية المتاحة، وإذا تجاوزت المساحة المتاحة، سيتم عرض شريط التمرير العمودي.

SingleChildScrollView Widget:

  • SingleChildScrollView widget يوفر إمكانية التمرير في اتجاه واحد (عمودي أو أفقي) لعناصره الفرعية.

  • يعني أنه يمكنك وضع أي عدد من العناصر داخل SingleChildScrollView وسيتمكن المستخدم من التمرير لعرض المحتوى الذي تجاوز المساحة المرئية.

عند وضع Column داخل SingleChildScrollView، ستحدث تداخلات في التصميم فقط إذا تم تمدد العناصر داخل Column لتزيد عن المساحة المتاحة في الاتجاه العمودي، وهذا قد يؤدي إلى تداخل بين العناصر وعدم رؤيتها بشكل صحيح. ولكن لن تحدث استثناءات، بل يمكن استخدام العنصر المتبقي للتمرير لعرض المحتوى الذي لا يتناسب مع المساحة المرئية.

لحل هذه المشكلة وضمان عرض المحتوى بشكل صحيح في SingleChildScrollView، يمكنك استخدام عناصر تحكم العرض والتنسيق الأخرى مثل Expanded وFlexible وSizedBox لتحديد حجم العناصر وتناسبها مع المساحة المتاحة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...