Проблема в Flutter при использовании ChangeNotifierProxyProvider в моем проекте. [Ссылка на мой проект прилагается] - PullRequest
0 голосов
/ 28 апреля 2020

Я не могу заставить работать мое приложение при использовании ChangeNotifierProxyProvider.

Ссылка на мой проект: https://github.com/BH4R47k/Practice-Shopping-App.git Я надеюсь, что кто-то загрузит проект и запустит его, чтобы решить мою проблему .

Посмотрите в файле main.dart, где я использую ChangeNotifierProxyProvider. Я хочу знать, сделал ли я что-то не так (не только в main.dart, но и в полном проекте [ссылка дана выше]), а также был бы признателен, если бы кто-то решил мою проблему.

И я также помещаю мой код здесь main.dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import './screens/splash_screen.dart';
import './screens/cart_screen.dart';
import './screens/products_overview_screen.dart';
import './screens/product_detail_screen.dart';
import './providers/products.dart';
import './providers/cart.dart';
import './providers/orders.dart';
import './providers/auth.dart';
import './screens/orders_screen.dart';
import './screens/user_products_screen.dart';
import './screens/edit_product_screen.dart';
import './screens/auth_screen.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider.value(
          value: Auth(),
        ),
        ChangeNotifierProxyProvider<Auth, Products>(
          create: (context) => Products(
            Provider.of<Products>(context).authToken,
            Provider.of<Products>(context).userId,
            Provider.of<Products>(context).items,
          ),
          update: (context, auth, previousProducts) => Products(
            auth.token,
            auth.userId,
            previousProducts == null ? [] : previousProducts.items,
          ),
        ),
        ChangeNotifierProvider.value(
          value: Cart(),
        ),
        ChangeNotifierProxyProvider<Auth, Orders>(
          create: (context) => Orders(
            Provider.of<Orders>(context).authToken,
            Provider.of<Orders>(context).userId,
            Provider.of<Orders>(context).orders,
          ),
          update: (context, 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
              ? ProductsOverviewScreen()
              : 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(),
            EditProductScreen.routeName: (ctx) => EditProductScreen(),
          },
        ),
      ),
    );
  }
}

Заранее спасибо.

1 Ответ

0 голосов
/ 03 мая 2020

Я использовал Необязательные параметры в конструкторе, чтобы мне не нужно было ничего передавать в файле main.dart.

Блок кода для products.dart (с дополнительными параметрами) выглядит следующим образом:

List<Product> _items;
String authToken = '';
String userId = '';

Products(this._items, [this.authToken, this.userId]);

Аналогичным образом был изменен блок кода для orders.dart.

Блок кода для файла main.dart выглядит так:

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