Flutter报错Undefined name 'mounted',求修改方案实现内购
解决Undefined name 'mounted'错误并实现内购功能
问题根源
mounted是StatefulWidget的State类专属属性,你的NavBar是StatelessWidget,没有这个属性,所以会报未定义错误。不需要额外导入任何包,只需要把组件改成StatefulWidget即可。
具体修改步骤
- 将
NavBar从StatelessWidget改为StatefulWidget,生成对应的_NavBarState类 - 将状态变量(比如
isSubscribed)和fetchOffers方法移到_NavBarState类中 - 在State类中可直接访问
mounted属性,无需额外处理
修改后的完整代码
import 'package:flutter/material.dart'; import 'package:AnyKnower/chatgpt.dart'; import 'package:AnyKnower/privacypolicy.dart'; import 'package:AnyKnower/purchase_api.dart'; import 'package:AnyKnower/utils.dart'; import 'package:glassfy_flutter/models.dart'; import 'package:provider/provider.dart'; import 'chat_screen.dart'; import 'package:page_transition/page_transition.dart'; import 'glassfy_provider.dart'; class NavBar extends StatefulWidget { const NavBar({super.key}); @override State<NavBar> createState() => _NavBarState(); } class _NavBarState extends State<NavBar> { bool isSubscribed = false; @override Widget build(BuildContext context) { return Drawer( child: ListView( padding: EdgeInsets.zero, children: [ ClipRRect( borderRadius: BorderRadius.only( topRight: Radius.circular(15), ), child: UserAccountsDrawerHeader( accountName: Text('AnyKnower'), accountEmail: Text(''), currentAccountPicture: CircleAvatar( child: ClipOval( child: Image.asset('assets/logo4.jpg', width: 100, height: 100, fit: BoxFit.cover), ), ), decoration: BoxDecoration( image: DecorationImage( image: AssetImage("assets/background1.jpg"), fit: BoxFit.cover, ), ), ), ), ListTile( leading: Icon(Icons.chat_rounded,color: Colors.blueGrey,), title: Text("AnyKnower Chat"), onTap: () { Navigator.of(context).push(PageTransition(child: ChatScreen(), type: PageTransitionType.fade)); } ), ListTile( leading: Icon(Icons.shopping_cart_outlined,color: Colors.blueGrey,), title: Text("The AnyKnower Shop"), onTap: () { fetchOffers(); } ), ListTile( leading: Icon(Icons.chat_outlined,color: Colors.blueGrey,), title: Text("Beta Premium chat"), onTap: () { Navigator.of(context).push(PageTransition(child: chatgpt(), type: PageTransitionType.fade)); } ), ListTile( leading: Icon(Icons.privacy_tip_outlined,color: Colors.blueGrey,), title: Text("Privacy Policy"), onTap: () { Navigator.of(context).push(PageTransition(child: privacypolicy(), type: PageTransitionType.fade)); } ), ], ) ); } Future fetchOffers() async { final offerings = await PurchaseApi.fetchOffers(); final offer = offerings.singleWhere((offering) => offering.offeringId == '100AnyKnowerCredit'); if(!mounted) return; Utils.showSheet( context, (context) => PayWallWidget( title: 'Upgrade your plan', description: 'kkdkdd', offer: offer, onClickedSku: (sku) async { final transaction = await PurchaseApi.purchaseSku(sku); if (!mounted) return; if (transaction != null) { final provider = context.read<GlassfyProvider>(); provider.add10Coins(); } Navigator.pop(context); }, ) ); } }
关键修改点说明
- 转为StatefulWidget后,
_NavBarState类拥有mounted属性,可判断当前Widget是否还挂载在Widget树上,避免异步请求完成后Widget已销毁导致的异常 fetchOffers方法移到State类后,无需再传递context,直接使用State类的context即可- 原代码中的
mounted!改为!mounted,写法更简洁且符合Dart空安全规范
内容的提问来源于stack exchange,提问作者Android_devNL
相关产品推荐
相关产品推荐

