I don't know where is mistake. Please help me to resolve the error! Thank you!
When I trying to run my project the app counter not working
and the studio give me this error
The error is
======== 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 PAGE
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 PAGE
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 PAGE
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 PAGE
import 'package:flutter/foundation.dart';
class ItemQuantity with ChangeNotifier
{
int _numberOfItems = 0;
int get numberOfItems => _numberOfItems;
display(int no)
{
_numberOfItems = no;
notifyListeners();
}
}
changeAddresss.dart PAGE
import 'package:flutter/foundation.dart';
class AddressChanger extends ChangeNotifier
{
int _counter = 0;
int get count => _counter;
displayResult(int v)
{
_counter = v;
notifyListeners();
}
}
totalMoney.dart PAGE
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();
});
}
}
This is the full error message
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)
====================================================================================================
Check your displayResult()
method for CartItemCounter
.
You have :
int _counter = EcommerceApp.sharedPreferences.getStringList(EcommerceApp.userCartList).length-1;
which means you're creating a new _counter
variable scoped to the method displayResult()
and will have no effect on the CartItemCounter's instance _counter
variable and by extension, the count
getter. This means notifyListeners()
does not do anything in the case.
The solution is to remove the int type in from of the _counter
so it does not create a new variable:
_counter = EcommerceApp.sharedPreferences.getStringList(EcommerceApp.userCartList).length-1;
Your CartItemCounter
will look like this now:
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();
});
}
}