小部件库 Consumer<CartItemCounter> 捕获异常

Exception caught by widgets library Consumer<CartItemCounter>

不知道哪里错了。请帮我解决错误! 谢谢!

When I trying to run my project the app counter not working

工作室给我这个错误

错误是

======== Exception caught by widgets library =======================================
The following NoSuchMethodError was thrown building Consumer<CartItemCounter>(dirty, dependencies: 
[_InheritedProviderScope<CartItemCounter>]):
The getter 'length' was called on null.
Receiver: null
Tried calling: length

The relevant error-causing widget was: 
  Consumer<CartItemCounter>

main.dart 页数

import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:e_shop/Counters/ItemQuantity.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'Authentication/authenication.dart';
import 'package:e_shop/Config/config.dart';
import 'Counters/cartitemcounter.dart';
import 'Counters/changeAddresss.dart';
import 'Counters/totalMoney.dart';
import 'Store/storehome.dart';
import 'package:firebase_core/firebase_core.dart';

Future<void> main() async
{
  WidgetsFlutterBinding.ensureInitialized();

  await Firebase.initializeApp();

  EcommerceApp.auth = FirebaseAuth.instance;
  EcommerceApp.sharedPreferences = await SharedPreferences.getInstance();
  EcommerceApp.firestore = FirebaseFirestore.instance;

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (c) => CartItemCounter()),
        ChangeNotifierProvider(create: (c) => ItemQuantity()),
        ChangeNotifierProvider(create: (c) => AddressChanger()),
        ChangeNotifierProvider(create: (c) => TotalAmount()),
      ],
      child: MaterialApp(
            title: 'ecommerce',
            debugShowCheckedModeBanner: false,
            theme: ThemeData(
              primaryColor: Colors.green,
            ),
            home: SplashScreen()
        ),
    );
  }
}

class SplashScreen extends StatefulWidget {
  @override
  _SplashScreenState createState() => _SplashScreenState();
}


class _SplashScreenState extends State<SplashScreen>
{
  @override
  void initState() {
    super.initState();

    displaySplash();
  }

  displaySplash()
  {
    Timer(Duration(seconds: 5), () async {
      if (await EcommerceApp.auth.currentUser !=null)
      {
        Route route = MaterialPageRoute(builder: (_) => StoreHome());
        Navigator.pushReplacement(context, route);
      }
      else
      {
        Route route = MaterialPageRoute(builder: (_) => AuthenticScreen());
        Navigator.pushReplacement(context, route);
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Material(
        child: Container(
          decoration: new BoxDecoration(
              gradient: new LinearGradient(
                colors: [Colors.blue, Colors.lightBlue],
                begin: const FractionalOffset (0.0, 0.0),
                end: const FractionalOffset (1.0, 0.0),
                stops: [0.0, 1.0],
                tileMode: TileMode.clamp,
              )
          ),
          child: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Image.asset("images/welcome.png"),
                SizedBox(height: 20.0,),
                Text(
                  "Salam Market",
                  style: TextStyle(color: Colors.white),
                ),
              ],
            ),
          ),
        )
    );
  }
}

storehome.dart 页数

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:e_shop/Store/cart.dart';
import 'package:e_shop/Store/product_page.dart';
import 'package:e_shop/Counters/cartitemcounter.dart';
import 'package:flutter/material.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:e_shop/Config/config.dart';
import '../Widgets/loadingWidget.dart';
import '../Widgets/myDrawer.dart';
import '../Widgets/searchBox.dart';
import '../Models/item.dart';

double width;

class StoreHome extends StatefulWidget {
@override
_StoreHomeState createState() => _StoreHomeState();
}

class _StoreHomeState extends State<StoreHome> {
  @override
  Widget build(BuildContext context) {
    width = MediaQuery.of(context).size.width;
    return SafeArea(
      child: Scaffold(
        appBar: AppBar(
          flexibleSpace: Container(
            decoration: new BoxDecoration(
              gradient: new LinearGradient(
                colors: [Colors.blue, Colors.purpleAccent],
                begin: const FractionalOffset (0.0, 0.0),
                end: const FractionalOffset (1.0, 0.0),
                stops: [0.0, 1.0],
                tileMode: TileMode.clamp,
              ),
            ),
          ),
          title: Text(
            "Salam Market",
            style: TextStyle(fontSize: 55.0, color: Colors.white, fontFamily: "Signatra"),
          ),
          centerTitle: true,
          actions: [
            Stack(
              children: [
                IconButton(
                  icon: Icon(Icons.shopping_cart, color: Colors.pink,),
                  onPressed: ()
                  {
                    Route route = MaterialPageRoute(builder: (c) => CartPage());
                    Navigator.pushReplacement(context, route);
                  },
                ),
                Positioned(
                  child: Stack(
                    children: [
                      Icon(
                        Icons.brightness_1,
                       size: 20.0,
                        color: Colors.green,
                      ),
                      Positioned(
                        top: 3.0,
                        bottom: 4.0,
                        left: 4.0,
                        child: Consumer<CartItemCounter>(
                          builder: (context, counter, _)
                          {
                            return Text(
                              counter.count.toString(),
                              style: TextStyle(color: Colors.white,fontSize: 12.0, 
                                  fontWeight: 
                                  FontWeight.w500),
                            );
                          },
                        ),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ],
        ),
        drawer: MyDrawer(),
      ),
    );
  }
}



Widget sourceInfo(ItemModel model, BuildContext context,
    {Color background, removeCartFunction}) {
  return InkWell();
}



Widget card({Color primaryColor = Colors.redAccent, String imgPath}) {
  return Container();
}



void checkItemInCart(String productID, BuildContext context)
{
}

cartitemcounter.dart 页数

import 'package:flutter/foundation.dart';
import 'package:e_shop/Config/config.dart';

class CartItemCounter extends ChangeNotifier
{
  int _counter = EcommerceApp.sharedPreferences.getStringList(EcommerceApp.userCartList).length-1;
  int get count => _counter;

  Future<void> displayResult() async
  {
    int _counter = EcommerceApp.sharedPreferences.getStringList(EcommerceApp.userCartList).length-1;

    await Future.delayed(const Duration(milliseconds: 100), (){
      notifyListeners();
    });
  }
}

ItemQuantity.dart 页数

import 'package:flutter/foundation.dart';

class ItemQuantity with ChangeNotifier
{
  int _numberOfItems = 0;

  int get numberOfItems => _numberOfItems;

  display(int no)
  {
    _numberOfItems = no;
    notifyListeners();
  }
}

changeAddresss.dart 页数

import 'package:flutter/foundation.dart';

class AddressChanger extends ChangeNotifier
{
  int _counter = 0;

  int get count => _counter;

  displayResult(int v)
  {
    _counter = v;
    notifyListeners();
  }
}

totalMoney.dart 页数

import 'package:flutter/cupertino.dart';

class TotalAmount extends ChangeNotifier
{
  double _totalAmount = 0;

  double get totalAmount => _totalAmount;

  display(double no) async
  {
    _totalAmount = no;

    await Future.delayed(const Duration(milliseconds: 100), (){
      notifyListeners();
    });
  }
}

这是完整的错误信息

Performing hot restart
Syncing files to device Android SDK built for x86...
Restarted application in 1 094ms.
W/DynamiteModule( 7762): Local module descriptor class for providerinstaller not found.
I/DynamiteModule( 7762): Considering local module providerinstaller:0 and remote module 
providerinstaller:0
W/ProviderInstaller( 7762): Failed to load providerinstaller module: No acceptable module found. 
Local version is 0 and remote version is 0.

======== Exception caught by widgets library =======================================================
The following NoSuchMethodError was thrown building Consumer<CartItemCounter>(dirty, dependencies: 
[_InheritedProviderScope<CartItemCounter>]):
The getter 'length' was called on null.
Receiver: null
Tried calling: length

The relevant error-causing widget was: 
  Consumer<CartItemCounter> file:///C:/Users/Admin/Desktop/e_shop/lib/Store/storehome.dart:68:32
When the exception was thrown, this was the stack: 
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:54:5)
#1      new CartItemCounter (package:e_shop/Counters/cartitemcounter.dart:6:90)
#2      MyApp.build.<anonymous closure> (package:e_shop/main.dart:34:47)
#3      _CreateInheritedProviderState.value (package:provider/src/inherited_provider.dart:646:35)
#4      _InheritedProviderScopeElement.value (package:provider/src/inherited_provider.dart:509:33)
====================================================================================================

This error after i remove int type

检查 displayResult() CartItemCounter 的方法。 你有:

int _counter = EcommerceApp.sharedPreferences.getStringList(EcommerceApp.userCartList).length-1;

这意味着您正在为方法 displayResult() 创建一个新的 _counter 变量 scoped,并且不会对 CartItemCounter 的实例 _counter 变量产生任何影响,并通过扩展, count getter。这意味着 notifyListeners() 在这种情况下不做任何事情。

解决方案是从 _counter 中删除 int 类型,这样它就不会创建新变量:

_counter = EcommerceApp.sharedPreferences.getStringList(EcommerceApp.userCartList).length-1;

您的 CartItemCounter 现在看起来像这样:

class CartItemCounter extends ChangeNotifier
{
  int _counter = EcommerceApp.sharedPreferences.getStringList(EcommerceApp.userCartList).length-1;
  int get count => _counter;

  Future<void> displayResult() async
  {
    _counter = EcommerceApp.sharedPreferences.getStringList(EcommerceApp.userCartList).length-1;

    await Future.delayed(const Duration(milliseconds: 100), (){
      notifyListeners();
    });
  }
}