首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:找不到这个Widget上面正确的Provider< >

错误:找不到这个Widget上面正确的Provider< >
EN

Stack Overflow用户
提问于 2022-04-28 16:16:45
回答 1查看 3.7K关注 0票数 1

我看不出我在以下方面做错了什么,但是它抛出了一些提供程序错误和构建上下文:这是因为您使用了不包括您选择的提供者的BuildContext。有几种常见的情况:

  • ,您在main.dart中添加了一个新的提供程序,并执行了热重加载。若要修复,请执行热重新启动.

您要读取的提供程序

  • 处于不同的路径。

提供者被“限定范围”。因此,如果在路由中插入提供程序,则其他路由将无法访问该提供程序。

  • 您使用了一个BuildContext,它是您要读取的提供程序的祖先。

确保SubscriptionsPage位于您的多提供者/提供程序之下。这通常发生在您正在创建一个提供程序并试图立即读取它时。

例如,而不是:

小部件构建(BuildContext上下文){返回提供者(创建:(_) =>示例( ),//将抛出一个ProviderNotFoundError,因为context关联//到Provider<Example>子组件的父部件: Text(context.watch()),),}

考虑像这样使用builder

小部件构建(BuildContext上下文){返回提供程序(创建:(_) =>示例( ),/我们使用builder获得一个新的BuildContext,它可以访问提供者生成器:(context) { //不再抛出返回文本(context.watch(),}),}

代码语言:javascript
复制
    class RevenueCatProvider extends ChangeNotifier{
          RevenueCatProvider() {
            init();
          }
          Entitlement _entitlement = Entitlement.free;
          Entitlement get entitlement => _entitlement;
          Future init() async {
            Purchases.addPurchaserInfoUpdateListener((purchaserInfo) async {
              updatePurchasesStatus();
            });
          }
          Future updatePurchasesStatus() async {
            final purchaserInfo = await Purchases.getPurchaserInfo();
            final entitlements = purchaserInfo.entitlements.active.values.toList();
            _entitlement = entitlements.isEmpty ? Entitlement.free : Entitlement.pro;
            notifyListeners();
          }
        }
代码语言:javascript
复制
class SubscriptionsPage extends StatefulWidget {
  const SubscriptionsPage({Key? key}) : super(key: key);

  @override
  State<SubscriptionsPage> createState() => _SubscriptionsPageState();
}

class _SubscriptionsPageState extends State<SubscriptionsPage> {
  bool isLoading = false;

  @override
  Widget build(BuildContext context) {

    final entitlement = Provider.of<RevenueCatProvider>(context).entitlement;

   return Scaffold(
      appBar: AppBar(
        title: const Text('Subscription Page'),
      ),
      body: Container(
        alignment: Alignment.center,
        padding: const EdgeInsets.all(32),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            buildEntitlement(entitlement),
            const SizedBox(height: 32),
            Padding(
              padding: const EdgeInsets.only(left: 20.0, right: 20),
              child: ElevatedButton(
                style: ElevatedButton.styleFrom(
                  minimumSize: const Size.fromHeight(50),
                ),
                child: const Text(
                  'See Available Plans',
                  style: TextStyle(fontSize: 20),
                ),
                onPressed: () => isLoading ? null : fetchOffers,
              ),
            ),
            const SizedBox(height: 32),
            SizedBox(
              height: 200,
              child: Image.asset('images/logo_transparent.png'),
            ),
          ],
        ),
      ),
    );
  }


  Widget buildEntitlement(Entitlement entitlement) {

    switch (entitlement) {
      case Entitlement.pro:
        return Column(
          mainAxisAlignment: MainAxisAlignment.end,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: const [
            SizedBox(height: 40),
            Text('You are on a Paid plan',
              style: TextStyle(
                fontSize: 20,
              ),
            ),
            SizedBox(height: 10),
            Icon(Icons.paid,
              size: 100,
            ),
          ],
        );
      case Entitlement.free:
      default:
        return Column(
          mainAxisAlignment: MainAxisAlignment.end,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: const [
            SizedBox(height: 40),
            Text('You are on a Free plan',
              style: TextStyle(
                fontSize: 20,
              ),
            ),
            SizedBox(height: 10),
            Icon(Icons.lock,
              size: 100,
            ),
          ],
        );
    }
  }


  Future fetchOffers() async {
    final offerings = await PurchaseApi.fetchOffers();

    if (offerings.isEmpty) {
      ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
        content: Text('No Subscription'),
      ));
    } else {
      final packages = offerings
          .map((offer) => offer.availablePackages)
          .expand((pair) => pair)
          .toList();


       showModalBottomSheet(
        useRootNavigator: true,
        isDismissible: true,
        isScrollControlled: true,
        backgroundColor: kLightPrimary,
        shape: const RoundedRectangleBorder(
          borderRadius: BorderRadius.vertical(top: Radius.circular(25.0)),
        ),
        context: context,
        builder: (BuildContext context) {
          return StatefulBuilder(
              builder: (BuildContext context, StateSetter setModalState) {
                return PaywallWidget(
                  packages: packages,
                  title: '⭐️ Upgrade your plan',
                  description: 'Upgrade your plan to enjoy unlimited ad-free reviews',
                  onClickedPackage: (package) async {
                    await PurchaseApi.purchasePackage(package);
                    Navigator.pop(context);
                  },
                );
              });
        },
      );
    }
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-28 16:44:32

您需要确保小部件树上的小部件树中有一个ChangeNotifierProvider,它使用变更通知器。

例如,当您调用final entitlement = Provider.of<RevenueCatProvider>(context).entitlement;时。在搜索匹配的ChangeNotifierProvider时,将遍历小部件树。

你收到的错误告诉你,没有。

像这样的东西应该管用。

代码语言:javascript
复制
class Sample extends StatelessWidget {
  const Sample({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
        create: (_) => new RevenueCatProvider(),
        child: SubscriptionsPage(),
    );
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72047084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档