#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", ), ));