【问题标题】:How to use SharedPreference Globally?如何在全球范围内使用 SharedPreference?
【发布时间】:2021-09-07 22:05:21
【问题描述】:

我将 userProfileID 和 ,userstype 的值都传递给 Profilepage() 如下所示,但是当我转到配置文件页面并尝试打印这两个变量的值时,我将得到 Null 值,我认为它们实际上没有通过从这个_HomePageState,有人帮忙吗?

     Here is Where I pass the Value of both 
    userProfileID as a UserID and userstype as UserTypes inside initState() below, 
    and both  UserID and UserTypes are Obtained from SharedPrefrence
 (I call GetData to obtain the value of  UserID and UserTypes from SharedPreference )
        
          class _HomePageState extends State<HomePage> {
         
              String UserID;
              String UserTypes;
              List<Widget>_children;
              bool isSignedIn= false;
              int _CurrentIndex=0;
            
              void initState(){
            
                    super.initState();
                       GetData();
            
                _children=[
                  TimeLinePage(UsersIdTimeline:UserID,UsersTypeTimeline:UserTypes),
                  SearchPage(searchUserSID: UserID,searchUsertype:UserTypes), //search(),
                  UploadPage(uploadUserSID:UserID,uploadUsertype:   UserTypes),
                  NotificationsPage(NotifyUserSID: UserID,NotifyUsertype:UserTypes),
                  ProfilePage(userProfileID:UserID,userstype:UserTypes),
                ];
               
                  if(FirebaseAuth.instance.currentUser!=null){
                    setState(() {
                      isSignedIn= true;
                    });
                  }else{
                    setState(() {
                      isSignedIn= false;
                       });
                  }
              }
              @override
              Widget build(BuildContext context) {
              if(isSignedIn){
               return buildHomeScreen();
            
             } else{
               return buildSignedInScreen();
             }
              }
             void GetData()async {
                SharedPreferences preferences= await SharedPreferences.getInstance();
                setState(() {
                   UserID=preferences.get('UserId');
                 UserTypes=preferences.get('UserType');
            
                });
              }
        
        }

    here is buildHomeScreen
    
   class _HomePageState extends State<HomePage> {
  // ignore: non_constant_identifier_names
  String UserID;
  String UserTypes;
  List<Widget>_children;
  List<Widget>_agentchildren;
  bool isSignedIn= false;
  // ignore: non_constant_identifier_names
  int _CurrentIndex=0;
  int _agentCurrentIndex=0;

  void initState(){
  
        super.initState();
           GetData();

    _children=[
      TimeLinePage(UsersIdTimeline:UserID,UsersTypeTimeline:UserTypes),
      SearchPage(searchUserSID: UserID,searchUsertype:UserTypes), 
      UploadPage(uploadUserSID:UserID,uploadUsertype:UserTypes),
      NotificationsPage(NotifyUserSID: UserID,NotifyUsertype:UserTypes),
      ProfilePage(userProfileID:UserID,userstype:UserTypes),
    ];
  
      if(FirebaseAuth.instance.currentUser!=null){
        setState(() {
          isSignedIn= true;
        });
      }else{
        setState(() {
          isSignedIn= false;
           });
      }
  }
  @override
  Widget build(BuildContext context) {
  if(isSignedIn){
 if(UserTypes=='agent'){
   return buildagentScreen();

 } else if(UserTypes== 'Signupuser'||
     UserTypes==  'owner'||
     UserTypes==  'seller'
    ){
   return buildHomeScreen();
     }else{
   return buildSignedInScreen();
 }

  }
  }

这是我的 ProfilePage(),如果我尝试获取两者的值 ( String userstype; String userProfileID;) 在这个页面 我得到 Null 值,但我已经从上面的 _HomePageState() 传递了它们的值

 class ProfilePage extends StatefulWidget {
            String userstype;
            String userProfileID;
           ProfilePage({this.userProfileID, this.userstype});
          @override
          _ProfilePageState createState() => _ProfilePageState();
        }
        class _ProfilePageState extends State<ProfilePage> {
          final String CurrentOnlineUserID=curentuser?.uid;
          bool loading =false;
          int countPost=0;
          String postOrientation="grid";
          List<Post> PostList=[];
          void initState(){
            getAllProfilePost();
          }
        
          @override
          Widget build(BuildContext context) {
        
            return Scaffold(
              backgroundColor: Colors.black,
                appBar:header(context,strTitle:"profile"),
                body:ListView(
                    children:<Widget>[
              TopView(),
                    ]
                ),
            );
          }

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    为您的应用程序全局使用共享首选项。

    import 'dart:async' show Future; 导入'package:shared_preferences/shared_preferences.dart';

    class PreferenceUtils {
      static Future<SharedPreferences> get _instance async => _prefsInstance ??= await SharedPreferences.getInstance();
      static SharedPreferences _prefsInstance;
    
      // call this method from iniState() function of mainApp().
      static Future<SharedPreferences> init() async {
        _prefsInstance = await _instance;
        return _prefsInstance;
      }
    
      static String getString(String key, [String defValue]) {
        return _prefsInstance.getString(key) ?? defValue ?? "";
      }
    
      static Future<bool> setString(String key, String value) async {
        var prefs = await _instance;
        return prefs?.setString(key, value) ?? Future.value(false);
      }
    }
    

    请点击此链接 https://stackoverflow.com/a/61046061/8218866

    【讨论】:

      【解决方案2】:

      _HomePageState 被创建时,initState被调用,所以这一行:

      _children=[
                        [...],
                        ProfilePage(userProfileID:UserID,userstype:UserTypes),
                      ];
      

      这一行正在创建ProfilePage 的对象,其中包含所需的用户ID 和用户类型。这个ProfilePage 对象将被放入_children 列表中。

      当你这样做时:

      setState(() {
                       UserID=preferences.get('UserId');
                       UserTypes=preferences.get('UserType');
                  
                      });
      

      您是 1) 再次调用 build 方法,以及 2) 更新 UserID 和 UserTypes 的值。您确实没有更改_childrens 列表中任何项目的值。或者列表本身。因此,您注意到了不当行为。

      有很多方法可以解决这个问题,但本质是将这个列表声明移动到 build 方法中。一个例子:

      @override
                    Widget build(BuildContext context) {
                    _children = [.....]
                    if(isSignedIn){
                        [...]
      

      这样做并不是一种漂亮的方法,因为每次调用 build 方法时都会创建许多新的(和无用的)对象。也许在小型应用程序中这不是问题,出于教学原因,我选择在此答案中以这种方式显示。

      更正确的方法是:

      • buildHomeScreen body 对象内切换和实例化:
      Scaffold buildHomeScreen(){
          Widget body;
          switch (_currentIndex) {
              case 0:
                body = 
          TimeLinePage(UsersIdTimeline:UserID,UsersTypeTimeline:UserTypes);
                break;
              case 1: 
                body = ...;
                break;
            }
      
      
          return Scaffold(
                 ...
                  body: body,
                 ...
      
          )
      }
      

      这应该会给你同样的结果。

      【讨论】:

      • 我更新了我的主页 请更正我的代码!我不清楚我是如何纠正它的,我想要的是从 _homepageState 传递 userProfileID 和 ,userstype 的值,
      • 我使用 setState() 来设置 SharedPreference 中的 UserID 和 UserTypes 的值,因为最初 UserID 和 UserTypes 为 null
      • 我使用 setState() 来设置来自 SharedPreference 的 UserID 和 UserTypes 的值,因为最初 UserID 和 UserTypes 为 null,而且我在创建具有所需的 ProfilePage 对象之前调用 SetState() 方法用户 ID 和用户类型
      • 我创建了一个全局 SharedPreference 类,请你给我一个提示,我如何在我的代码中使用它,例如我如何将它从 _homePageState() 传递给配置文件 page()
      • 非常感谢一切都为我分叉。你很聪明,
      猜你喜欢
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 2017-06-12
      • 2017-12-09
      相关资源
      最近更新 更多