0

i am building mobile app using flutter. i try to use provider but it doesn't get the value.

this is the code for class change notifier

class StoreProvider with ChangeNotifier{

   UserServices _userServices = UserServices();
   StoreServices _storeServices = StoreServices();
   User user = FirebaseAuth.instance.currentUser;
   String userLocation = "";
   String selectedStore;
   String selectedStoreId;


   getSelectedStore(storeName, storeId){
     this.selectedStore = storeName;
      this.selectedStoreId = storeId;
     notifyListeners();
   }
}

this is the code where i call this function

ListView(
                shrinkWrap: true,
                scrollDirection: Axis.horizontal,
                children: snapshot.data.docs.map((DocumentSnapshot document) {
                  return InkWell(
                    onTap: (){
                      _storeData.getSelectedStore(document['shopName'], document['uid']);
                      pushNewScreenWithRouteSettings(
                        context,
                        settings: RouteSettings(name: VendorHomeScreen.id),
                        screen: VendorHomeScreen(),
                        withNavBar: true,
                        pageTransitionAnimation: PageTransitionAnimation.cupertino,
                      );
                    },
                    child: Padding(
                      padding: const EdgeInsets.only(top: 4, right: 4, left: 4),
                      child: Container(
                        width: 120,
                        child: Column(
                          children: [
                            SizedBox(
                              width: 120,
                              height: 100,
                              child: Card(
                                  child: ClipRRect(
                                    borderRadius: BorderRadius.circular(4),
                                      child: Image.network(document['imageUrl'],))),
                            ),
                            Container(
                              height: 35,
                              child: Text(document['shopName'], style: TextStyle(
                                fontSize: 14, fontWeight: FontWeight.bold,
                              ), maxLines: 2, overflow: TextOverflow.ellipsis,),
                            ),
                          ],
                        ),
                      ),
                    ),
                  );
                }).toList(),
              ),

this is the code where i want to get the value that i put to the provider

var _store = Provider.of<StoreProvider>(context);
return Scaffold(
    body: NestedScrollView(
  headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
    return [
      SliverAppBar(
        iconTheme: IconThemeData(
          color: Colors.white,
        ),
        actions: [
          IconButton(
            onPressed: () {},
            icon: Icon(CupertinoIcons.search),
          )
        ],
        title: Text(
          **//this is the error**
          **//this is the error**
          **//this is the error**
          **//this is the error**
          **//this is the error**
          **_store.selectedStoreId,**
          style:
              TextStyle(fontWeight: FontWeight.bold, color: Colors.white),
        ),
      )
    ];
  },
  body: Center(
    child: Text('vendor screen'),
  ),
));

and this is the main file

void main() async {
  Provider.debugCheckInvalidValueType = null;
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MultiProvider(
    providers: [
      ChangeNotifierProvider(create: (_) => AuthProvider()),
      ChangeNotifierProvider(create: (_) => StoreProvider()),
    ],
   child: MyApp(),
 ));
}

 class MyApp extends StatelessWidget {
  // This widget is the root of your application.
 @override
  Widget build(BuildContext context) {
    return MaterialApp(
     debugShowCheckedModeBanner: false,
       theme: ThemeData(primaryColor: Colors.lightBlueAccent, fontFamily: 'Lato'),
     initialRoute: SplashScreen.id,
     routes: {
    SplashScreen.id: (context) => SplashScreen(),
    LoginPage.id: (context) => LoginPage(),
    SignupPage.id: (context) => SignupPage(),
    HomePage.id: (context) => HomePage(),
    ResetPassword.id: (context) => ResetPassword(),
    MainScreen.id: (context)=> MainScreen(),
    VendorHomeScreen.id: (context) => VendorHomeScreen(),
  },
);
}

}

i always get 'a non null A non-null String must be provided to a Text widget.' i think the problem is when i put the value in the change notifier class and i try to get the value in other class, the value is null. does anyone know what is the mistake??

thank you

ryan chandra
  • 321
  • 3
  • 11

0 Answers0