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

السؤال

نشر

يحدث الخطأ التالي عند استدعاء 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...