Необработанное исключение: Поиск предка деактивированного виджета небезопасен. как это решить?

#flutter #stripe-payments #flutter-widget

#трепетать #stripe-платежи #флаттер-виджет

Вопрос:

я пытаюсь интегрировать оплату stripe в мобильное приложение flutter. После завершения оплаты я хочу, чтобы приложение выполнило Navigator.pop(контекст). Однако я получил сообщение об ошибке, в котором говорится

«Необработанное исключение: Поиск предка деактивированного виджета небезопасен. E/flutter ( 2773): На данный момент состояние дерева элементов виджета больше не является стабильным».

это мой код для оплаты в полоску

 class ExistingCardsPage extends StatefulWidget {  static const String id = 'exsiting-card';  ExistingCardsPage({Key key}) : super(key: key);   @override  ExistingCardsPageState createState() =gt; ExistingCardsPageState(); }  class ExistingCardsPageState extends Statelt;ExistingCardsPagegt; {  List cards = [];  StripeService _service = StripeService();   Futurelt;StripeTransactionResponsegt; payViaExistingCard(  BuildContext context, card, amount) async {  await EasyLoading.show(status: "Please wait....");  var expiryArr = card['expiryDate'].split('/');  CreditCard stripeCard = CreditCard(  number: card['cardNumber'],  expMonth: int.parse(expiryArr[0]),  expYear: int.parse(expiryArr[1]),  );  var response = await StripeService.payViaExistingCard(  amount: '${amount}00', currency: 'USD', card: stripeCard);  await EasyLoading.dismiss();  ScaffoldMessenger.of(context).showSnackBar(  SnackBar(  content: Text(response.message),  duration: new Duration(milliseconds: response.success == true ? 1200 : 3000),  )  ).closed.then((_) {  Navigator.pop(context); /////THIS IS THE ERROR/////   });   return response; }   @override  Widget build(BuildContext context) {  final orderProvider = Provider.oflt;OrderProvidergt;(context);  return Scaffold(  appBar: AppBar(  iconTheme: IconThemeData(color: Colors.white),  title: Text('Choose existing card', style: TextStyle(color: Colors.white),),  ),  body: FutureBuilderlt;QuerySnapshotgt;(  future: _service.cards.get(),  builder: (BuildContext context, AsyncSnapshotlt;QuerySnapshotgt; snapshot) {  if (snapshot.hasError) {  return Text('Something went wrong');  }   if (snapshot.connectionState == ConnectionState.waiting) {  return Center(child: CircularProgressIndicator());  }   if(snapshot.data.size==0){  return Center(  child: Text('No Credit Card in your account'));  }   return Container(  padding: EdgeInsets.only(left: 8, top: 10, right: 8, bottom: 10),  child: ListView.builder(  itemCount: snapshot.data.docs.length,  itemBuilder: (BuildContext context, int index) {  var card = snapshot.data.docs[index];  return InkWell(  onTap: () {  payViaExistingCard(context, card, orderProvider.amount).then((response) {  if(response.success==true){  orderProvider.paymentStatus(response.success);  }  });  },  child: CreditCardWidget(  cardNumber: card['cardNumber'],  expiryDate: card['expiryDate'],  cardHolderName: card['cardHolderName'],  cvvCode: card['cvvCode'],  showBackView: false,  onCreditCardWidgetChange: (brand) {  print(brand);  },  ),  );  },  ),  );  },  ) ); } }  

кто — нибудь знает, что не так с кодом?

Спасибо

Ответ №1:

Используйте глобальный контекст для закусочной

 // declare as global GlobalKeylt;ScaffoldMessengerStategt; scaffoldMessengerKey=GlobalKeylt;ScaffoldMessengerStategt;();  

Просто добавьте это в main.dart файл в

 @override  Widget build(BuildContext context) {  return MaterialApp(  title: 'App Name',  scaffoldMessengerKey: scaffoldMessengerKey, // add this  );  }  

Тогда мы сможем использовать это в любом месте приложения, не передавая контекст каждой страницы.

 scaffoldMessengerKey.currentState.showSnackBar(SnackBar(  content: Text(  "Your Message",  ),  ));