Flutter: я получил эту ошибку ›Неудачное утверждение: строка 447, позиция 12: 'context! = Null': неверно

У меня есть виджет, который возвращает alertDialog, и в соответствии с результатом http-запроса я показываю другой alertDialog. Орех, я получил следующую ошибку:

[ОШИБКА: flutter / lib / ui / ui_dart_state.cc (157)] Необработанное исключение: 'package: flutter / src / widgets / localizations.dart': неудачное утверждение: строка 447 поз. 12: 'context! = Null': не правда.



import 'dart:io';

import 'package:Zabatnee/common_app/provider/user_details_provider.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class ForgetPasswordDialog extends StatefulWidget {
  static const routeName = '/customeDialog';
  final String title,description;
  

  ForgetPasswordDialog({
    this.title, 
    this.description,
    });

  @override
  _ForgetPasswordDialogState createState() => _ForgetPasswordDialogState();
}

class _ForgetPasswordDialogState extends State<ForgetPasswordDialog> {
final emailController = TextEditingController();
  var _isLoading = false;

_showDialog(String title, String message) {
    showDialog(
      barrierDismissible: false,
      context: context,
      builder: (ctx) => WillPopScope(
        onWillPop: () async => false,
        child: new AlertDialog(
          elevation: 15,
          shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.all(Radius.circular(8))),
          title: Text(
            title,
            style: TextStyle(color: Colors.white),
          ),
          content: Text(
            message,
            style: TextStyle(color: Colors.white),
          ),
          backgroundColor: Theme.of(context).primaryColor,
          actions: <Widget>[
            FlatButton(
              child: Text(
                'OK',
                style: TextStyle(color: Theme.of(context).accentColor),
              ),
              onPressed: () {
                Navigator.of(context).pop();
                setState(
                  () {
                    _isLoading = false;
                  },
                );
              },
            )
          ],
        ),
      ),
    );
  }



  Future<void> _forgetPassword (String email) async {

    try{
      if(mounted)
     setState(() {
       _isLoading = true;
     }); 
    await Provider.of<UserDetailsProvider>(context, listen: false).forgetPassword(email);
      print('code are sent via email');
       _showDialog('Conguratulations', 'code send successfully');
    } on HttpException catch (error) {
      _showDialog('Authentication Failed', error.message);
    } on SocketException catch (_) {
      _showDialog('An error occured',
          'please check your internet connection and try again later');
    } catch (error) {
      _showDialog('Authentication Failed',
          'Something went wrong, please try again later');
    }
    if(mounted)
    setState(() {
      _isLoading = false;
    });
  }
  @override
  void dispose() {
    emailController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Dialog(
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(16)
      ),
      elevation: 8,
      backgroundColor: Theme.of(context).accentColor,
      child: dialogContent(context),
    );
  }

  dialogContent(BuildContext context){
    

    return Container(
      padding: EdgeInsets.only(
        top: 50,
        right: 16,
        left: 16,
        bottom: 16,
      ),
      margin: EdgeInsets.all(8),
      width: double.infinity,
      decoration: BoxDecoration(
        color: Theme.of(context).accentColor,
        shape: BoxShape.rectangle,
        borderRadius: BorderRadius.circular(17),
        boxShadow: [
          BoxShadow(
            color: Colors.black87,
            blurRadius: 10.0,
            offset: Offset(0.0,10.0),
          )
        ]
      ),
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          Text(
            widget.title,
            style: TextStyle(
              fontSize: 24,
            ),
            ),
          SizedBox(
            height: 20,
          ),
          Text(widget.description, style: TextStyle(fontSize: 16),
          ),
          SizedBox(
            height: 20,
          ),
          TextField(
            controller: emailController,
            style: TextStyle(color: Colors.white),
            keyboardType: TextInputType.emailAddress,
            decoration: InputDecoration(
              border: OutlineInputBorder(
                borderSide: BorderSide(color:Theme.of(context).primaryColor)
              ),
              fillColor: Colors.black87,
              hintStyle: TextStyle(color:Colors.grey),
              hintText: 'please enter your email',
              labelText: 'Email',
              labelStyle: TextStyle(color:Colors.white)
            ),  
          ),
          SizedBox(
            height: 20,
          ),
          Container(
            width: double.infinity,
            child: RaisedButton(
              child: Text('Send'),
              onPressed: (){
                _isLoading 
                ? CircularProgressIndicator()
                : print(emailController.text);
                _forgetPassword(emailController.text);
                Navigator.of(context).pop();
              }
              ),
          ),
          Container(
            width: double.infinity,
            child: RaisedButton(
              child: Text('Cancel'),
              onPressed: (){
                Navigator.of(context).pop();
              }
              ),
          ),  
        ],
      ),
    );
  }
}


person Ahmad Mohy    schedule 10.08.2020    source источник


Ответы (1)


В вашем showDialog вы не передали контекст (в параметрах).

Делай это так,

_showDialog(String title, String message, BuildContext context) {
    showDialog(
      barrierDismissible: false,
      context: context,
      builder: (ctx) => WillPopScope(
        onWillPop: () async => false,
        child: new AlertDialog(
          elevation: 15,

)

Затем при вызове функции также передайте контекст,

_showDialog('Conguratulations', 'code send successfully', context);
person Madhavam Pratap Shahi    schedule 10.08.2020
comment
Пожалуйста, проголосуйте и примите это как ответ, если это помогло :) - person Madhavam Pratap Shahi; 10.08.2020