【问题标题】:Unhandled Exception: A Products was used after being disposed未处理的异常:处理后使用了产品
【发布时间】:2020-04-26 16:52:48
【问题描述】:

我正在使用MultiProvider,但出现此错误:

Unhandled Exception: A Products was used after being disposed. Once you have called dispose() on a Products, it can no longer be used.

这是我的 main.dart 文件。这个结构有什么问题?

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider.value(
          value: Auth(),
        ),
        ChangeNotifierProxyProvider<Auth, Products>(
          update: (ctx, auth, previousProducts) => Products(
            auth.token,
            auth.userId,
            previousProducts == null ? [] : previousProducts.items,
          ),
        ),
        ChangeNotifierProvider.value(
          value: Cart(),
        ),
        ChangeNotifierProxyProvider<Auth, Orders>(
          update: (ctx, auth, previousOrders) => Orders(
            auth.token,
            auth.userId,
            previousOrders == null ? [] : previousOrders.orders,
          ),
        ),
      ],
      child: Consumer<Auth>(
        builder: (ctx, auth, _) => MaterialApp(
          title: 'MyShop',
          theme: ThemeData(
            primarySwatch: Colors.purple,
            accentColor: Colors.deepOrange,
            fontFamily: 'Lato',
          ),
          home: auth.isAuth
              ? ProductOverviewScreen()
              : FutureBuilder(
            future: auth.tryAutoLogin(),
            builder: (ctx, authResultSnapshot) =>
            authResultSnapshot.connectionState ==
                ConnectionState.waiting
                ? SplashScreen()
                : AuthScreen(),
          ),
          routes: {
            ProductDetailScreen.routeName: (ctx) => ProductDetailScreen(),
            CartScreen.routeName: (ctx) => CartScreen(),
            OrdersScreen.routeName: (ctx) => OrdersScreen(),
            UserProductsScreen.routeName: (ctx) => UserProductsScreen(),
            EditProductsScreen.routeName: (ctx) => EditProductsScreen(),
          },
        ),
      ),
    );
  }
}

【问题讨论】:

  • 我遇到了同样的问题,我看到问题已经提交了一段时间。你能得到任何答案吗?
  • 我觉得这个结构没什么问题。 (至少我不知道出了什么问题)它看起来很像一个错误,因为我在具有这种结构的不同项目中没有出错。
  • 我得到了完全相同的错误,但设置非常相似。有没有找到解决办法?

标签: flutter dart


【解决方案1】:

使用 yourProvider.value 而不是创造你的问题将得到解决。谢谢

  itemBuilder: (ctx, index) => ChangeNotifierProvider.value(
        value: products[index],
        child: ProductItem(),
      ),
      itemCount: products.length,
    );

【讨论】:

  • 这应该是公认的答案,对我有用。
  • 谢谢!我添加了对象的类型以更好地工作。 ChangeNotifierProvider&lt;Servico&gt;.value(...)
【解决方案2】:

我也遇到了同样的错误,我通过以下方式解决了它:

ChangeNotifierProvider<"Provider name">.value(value:<PassedValue>);

似乎 ChangeNotifierProvider 创建了提供者的一个实例,当它的工作完成时,dispose() 方法被调用,因此,该实例被 ChangeNotifierProvider.value 清除,事实并非如此,我们可以重新使用之前的创建实例。

这里是官方文档:https://pub.dev/packages/provider

【讨论】:

    【解决方案3】:

    我认为您必须将 Products Provider 添加到 providers: [] 上面的代理提供者作为 Auth Provider 的定义,如下所示:

    providers: [
        ChangeNotifierProvider<Auth>.value(
                              value: Auth(),
         ChangeNotifierProvider<Products>.value(
                              value: Products(),
        ChangeNotifierProxyProvider<Auth, Products>(
          update: (ctx, auth, previousProducts) => Products(
            auth.token,
            auth.userId,
            previousProducts == null ? [] : previousProducts.items,
          ),
        ),
        ChangeNotifierProvider<Cart>.value(
          value: Cart(),
        ),
        ChangeNotifierProxyProvider<Auth, Orders>(
          update: (ctx, auth, previousOrders) => Orders(
            auth.token,
            auth.userId,
            previousOrders == null ? [] : previousOrders.orders,
          ),
        ),
      ],
    

    【讨论】:

      【解决方案4】:

      使用

      Navigator.of(context).pushNamed('/');
      

      在你打电话给logout的抽屉里。 这将解决这个问题 谢谢。。

      【讨论】:

        猜你喜欢
        • 2021-01-01
        • 2020-12-09
        • 1970-01-01
        • 1970-01-01
        • 2011-11-19
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        相关资源
        最近更新 更多