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

يحدث خطأ عند اظهار snackbar في flutter

احمد صوالحة

السؤال

يحدث الخطأ التالي عند استدعاء Scaffold.of(context) لإظهار snackbar :

1.thumb.png.fb89d20c28cb664f5eb61c189c11fab3.png

هذا هو الكود الخاص بالشاشة الذي يحدث بها الخطأ:

import 'package:flutter/material.dart';

void main() => runApp(MyHomePage());

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'test',
      theme: ThemeData(
        primarySwatch: Colors.cyan,
      ),
      home: Page1(),
    );
  }
}
class Page1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('page1'),
      ),
      body: Center(
        child: RaisedButton(
          color: Colors.cyan,
          textColor: Colors.white,
          onPressed: (){

            Scaffold.of(context).showSnackBar(SnackBar(content: Text('Hey there')));
          },
          child: Text('show snackbar'),
        ),
      ),
    );
  }
}


 

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

Recommended Posts

  • 1

تحدث هذه المشكلة بسبب إرفاقك للـcontext الذي قام بإنشاء الـscaffold  بدلاً من إرفاق context ضمن الـscaffold.
يمكن حل المشكلة من خلال إحدى الطرق التالية:

  • الطريقة الأولى: إضافة Builder بحيث يعطينا context ضمن الـscaffold ومن ثم نقوم بإرفاقه للـ scaffold.of:
body: Builder(
	Builder: (context){
	//نضع هنا  كل العناصر المراد عرضها لتأخذ الـ
	//context
	//الخاص بالـ
	//scaffold
	}
);

إليك الكود الكامل بعد التعديل:

import 'package:flutter/material.dart';
void main() => runApp(MyHomePage());
class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'test',
      theme: ThemeData(
        primarySwatch: Colors.cyan,
      ),
      home: Page1(),
    );
  }
}
class Page1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('page1'),
      ),
      body:Builder(
        builder: (context) => Center( //***
          child: RaisedButton(
            color: Colors.cyan,
            textColor: Colors.white,
            onPressed: (){
              Scaffold.of(context).showSnackBar(SnackBar(content: Text('Hey there')));
            },
            child: Text('show snackbar'),
          ),
        )
      ),
    );
  }
}
  • الطريقة الثانية: حفظ الـscaffold في GlobalKey الذي سيلزمنا في إظهار الـsnackbar.
class Page1 extends StatelessWidget {
  final GlobalKey<ScaffoldState> _myScaffold = new GlobalKey();
//…
}

بعد تعريف GlobalKey نقوم بتعيينه في خصائص الـScaffold:

Scaffold(
      key: _myScaffold,
      //...
	);

الآن يمكننا إظهار الـsnackbar بدون الحاجة للـcontext من خلال الـGlobalKey:

_myScaffold.currentState.showSnackBar(SnackBar(content:Text('Hey there'),));

مرفق الكود الكامل بعد التعديل:

import 'package:flutter/material.dart';

void main() => runApp(MyHomePage());

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'test',
      theme: ThemeData(
        primarySwatch: Colors.cyan,
      ),
      home: Page1(),
    );
  }
}

class Page1 extends StatelessWidget {
  final GlobalKey<ScaffoldState> _myScaffold = new GlobalKey();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _myScaffold,
      appBar: AppBar(
        title: Text('page1'),
      ),
      body:Center(
        child: RaisedButton(
          color: Colors.cyan,
          textColor: Colors.white,
          onPressed: (){

            _myScaffold.currentState.showSnackBar(SnackBar(content:Text('Hey there'),));
          },
          child: Text('show snackbar'),
        ),
      ),

    );
  }
}

 

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...