How to get class value from flutter provider?

658 Views Asked by At

In my main.dart page I use MultiProvider as shown below. I initialise first two provider in main.dart and I initialise UserInfoProvider in user page.

In user page after initState I get data from remote database and I initialise like shown below. But when I call the values for each provider first 2 providers returns a value but UserInfoProvider returns a null.

How to get UserInfoProvider _currentUserPhone value?

UPDAE: (1) NOT WORKING PART: Below initialisation didnt work when I try to get a value from provider because I am creating another instance an object. Correct way is in below:

UserInfoProvider initialisation:

UserInfoProvider userInfoProvider = UserInfoProvider();
userInfoProvider.initUserInfo(
    "$_currentCustomerNo",
    "$_currentCustomerToken",
    "$_currentCustomerName",
    "$_currentUserMobile",
    "$_currentUserEmail",
    "$_currentUserAddress",
    1);

UPDAE: (2) WORKING PART:

 Provider.of<UserInfoProvider>(context, listen: false).userMobile = _currentUserMobile;

show_user_data.dart:

  /// (1) INIT STATE
  @override
  void initState() {
    super.initState();

    setState(() {
      // TODO: GET DEVICE TYPE from PROVIDER
      deviceTypeMobile = Provider.of<DeviceInfoProvider>(context, listen: false).deviceMobile;

      // TODO: GET APP VERSION from PROVIDER
      final String _tempBuildNo = Provider.of<PackageInfoProvider>(context, listen: false).buildNumber;
      _appBuildNumber = int.parse(_tempBuildNo.toString().trim());

      // TODO: GET USER INFO from PROVIDER
      _currentUserPhone = Provider.of<UserInfoProvider>(context, listen: false).userMobile;
    });

    print("\n\n");
    print("===========================================================================");
    print("===========================================================================");
    print("deviceTypeMobile: $deviceTypeMobile");
    print("_appBuildNumber: $_appBuildNumber");
    print("_currentUserPhone: $_currentUserPhone");
    print("===========================================================================");
    print("===========================================================================");
  }

Result:

===========================================================================
===========================================================================
deviceTypeMobile: true
_appBuildNumber: 47
_currentUserPhone: null
===========================================================================
===========================================================================

main.dart

void main() async {
  PackageInfoProvider packageInfoProvider = PackageInfoProvider();
  packageInfoProvider.initPackageInfo();

  DeviceInfoProvider deviceInfoProvider = DeviceInfoProvider();
  deviceInfoProvider.initDeviceInfo();

  //runApp(NTMSApp());
  runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => packageInfoProvider),
        ChangeNotifierProvider(create: (_) => deviceInfoProvider),
        ChangeNotifierProvider(create: (_) => UserInfoProvider())
      ],
      child: NTMSApp(),
    ),
  );
}

package_info_provider.dart

class PackageInfoProvider with ChangeNotifier {
  String appName = "";
  String packageName = "";
  String version = "";
  String buildNumber = "";

  Future<void> initPackageInfo() async {
    final PackageInfo info = await PackageInfo.fromPlatform();
    appName = info.appName;
    packageName = info.packageName;
    version = info.version;
    buildNumber = info.buildNumber;
    notifyListeners();
  }
}

user_info_provider.dart

class UserInfoProvider extends ChangeNotifier {
  String userNo = "";
  String userToken = "";
  String userName = "";
  String userMobile = "";
  String userEmail = "";
  String userAddress = "";
  int userAuthority = 0;

  void initUserInfo(
      String currentUserNo,
      String currentUserToken,
      String currentUserName,
      String currentUserMobile,
      String currentUserEmail,
      String currentUserAddress,
      int userAuthority) {
    userNo = currentUserNo;
    userToken = currentUserToken;
    userName = currentUserName;
    userMobile = currentUserMobile;
    userEmail = currentUserEmail;
    userAddress = currentUserAddress;
    userYetki = currentUserYetki;
    notifyListeners();
  }
}

UPDATE:

In UserInfoProvider I declare all my variable as String userMobile; as suggested. I got the value from database and I printed (1) successfully. I also print the value before (2) notifyListeners(); also I print the (3) value after initializing user provider. But In my another page (4) I couldn't print the value.

    (1) +++++++++++++++++++++++++++++++++++++++++
    flutter: IN data from socket API - before Provider Initialise
    flutter: _currentUserMobile: 53******90
    flutter: +++++++++++++++++++++++++++++++++++++++++
    flutter: 
    
    (2) +++++++++++++++++++++++++++++++++++++++++
    flutter: IN void initUserInfo() in class UserInfoProvider
    flutter: currentUserMobile: 53******90
    flutter: userMobile: 53******90
    flutter: +++++++++++++++++++++++++++++++++++++++++
    flutter: 
    
    (3) +++++++++++++++++++++++++++++++++++++++++
    flutter: IN data from socket API - after Provider Initialise
    flutter: _currentUserMobile: 53******90
    flutter: +++++++++++++++++++++++++++++++++++++++++
    flutter:
    flutter: 

   (4) +++++++++++++++++++++++++++++++++++++++++
    flutter: deviceTypeMobile: false
    flutter: _appBuildNumber: 67
    flutter: _currentUserPhone: null 
    +++++++++++++++++++++++++++++++++++++++++ 
    flutter:
    flutter: 
0

There are 0 best solutions below