首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在全球使用SharedPreference?

如何在全球使用SharedPreference?
EN

Stack Overflow用户
提问于 2021-06-24 03:55:02
回答 2查看 104关注 0票数 0

我将userProfileID和userstype的值传递给profile (),如下所示,但是当我转到profile页面时,当我试图打印这两个变量的值时,我将得到Null值,我认为它们实际上不是从这个_HomePageState传递的,有人帮助吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     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');
            
                });
              }
        
        }

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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;String userProfileID;),我得到的是Null值,但是我总是从上面的_HomePageState()传递它们的值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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(),
                    ]
                ),
            );
          }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-24 05:38:04

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

导入‘dart:异步’显示未来;导入'package:shared_preferences/shared_preferences.dart';

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
EN

Stack Overflow用户

发布于 2021-06-24 04:32:32

创建_HomePageState时,调用initState,因此这一行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
_children=[
                  [...],
                  ProfilePage(userProfileID:UserID,userstype:UserTypes),
                ];

这一行是使用所需的UserID和UserTypes创建ProfilePage的对象。这个ProfilePage对象将放在_children列表中。

当你这样做时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
setState(() {
                 UserID=preferences.get('UserId');
                 UserTypes=preferences.get('UserType');
            
                });

再次调用build方法,2)更新UserID和UserTypes的值。您做了,而不是,更改了_childrens列表中任何项的值。或者名单本身。所以你注意到了。

解决这个问题的方法有很多,但本质是在构建方法中移动这个列表声明。举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@override
              Widget build(BuildContext context) {
              _children = [.....]
              if(isSignedIn){
                  [...]

这样做并不是一种很好的方法,因为每次调用build方法时,您都会创建许多新的(无用的)视图。也许在一个小的应用程序中,这不会是一个问题,而且出于说教的原因,我选择在这个答案中以这种方式显示出来。

更正确的办法是:

  • 开关并在buildHomeScreen内实例化body对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Scaffold buildHomeScreen(){
    Widget body;
    switch (_currentIndex) {
        case 0:
          body = 
    TimeLinePage(UsersIdTimeline:UserID,UsersTypeTimeline:UserTypes);
          break;
        case 1: 
          body = ...;
          break;
      }


    return Scaffold(
           ...
            body: body,
           ...

    )
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68115277

复制
相关文章
axios的响应处理
在使用Axios发送请求后,可以通过.then()方法来处理成功的响应,并获取返回的数据。以下是一个示例:
堕落飞鸟
2023/05/19
1.4K0
vue for循环中按顺序axios请求拿到每条数据对应的状态
在循环数组的时候基于每个对象中的某个参数来进行数据请求,获取当前对象对应的数据状态 实现方法基于最新的es6中的async await 来实现 首先要把对应的Promise方法进行一个封装
李维亮
2021/07/08
1.9K0
for循环的执行顺序
第二步,判别表达式2是否满足给定条件,若其值为真,满足循环条件,则执行循环体内语句,然后执行表达式3,然后进入第二次循环。若判断表达式2的值为假,就终止for循环,执行循环体外语句。
全栈程序员站长
2022/07/15
1.8K0
顺序循环队列
1 //循环队列的顺序存储表示与实现 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 /****************************************************************************** 7 /* 数据类型和常量定义 8 /*****************************************************************************
猿人谷
2018/01/17
8120
顺序循环队列
for循环中执行顺序_顺序结构选择结构循环结构
今天刷题碰到的一个坑,就是没有注意到for循环的每次判断条件导致的**,也就是for循环的第二句**,每次循环都会执行该判断条件。
全栈程序员站长
2022/11/17
8210
java继承的调用顺序
加入了子类以后,执行顺序有了新的变化,我们可以总结一下。首先第一部分执行的是父类的静态代码块—子类的静态代码块—主程序。这一部分都是执行一次,与建立多少对象没有关系。第二部分new了一个父类对象,并调用了方法。执行了它的非静态代码块—构造函数—一般方法。第三部分new了一个子类的对象,并调用了方法。执行顺序为父类的非静态代码块—父类的无参构造函数,然后是子类的非静态代码块—子类构造函数—子类的方法。
用户7043603
2022/02/27
8070
vue-axios调用接口
引入axios 和qs; axios的浏览器兼容器.png getMsg() { axios ( { method: "post", url: " 接口地址", responseType:
用户4344670
2019/08/28
7960
vue-axios调用接口
Axios调用后台接口
axios.post('http:phpapi.com', { key: key, type: 'getdata', data: { id: 1 } }) .then(function (res) { // 成功的回调 console.log(res) }) .catch(function (error) { // 失败的回调 console.log(error); });
明知山
2020/09/03
1.5K0
axios django CSRF 403错误
使用axios直接post django的接口的时候会提示CSRF 403错误 可以在post的data中转入csrftoken 也可以给单个方法关闭 from django.views.decorators.csrf import csrf_exempt,csrf_protect @csrf_exempt def test(request): pass
小贝壳
2020/03/05
1.4K0
循环数组
array ( 'product_id' => array ( 0 => '1', 1 => '16', ), 'product_price_id' => array ( 0 => '2', 1 => '', ), 'qty' => array ( 0 => '1', 1 => '1', ), )
botkenni
2022/01/10
1.3K0
axios拦截所有请求和响应
chao超的搬运文章
2023/10/15
2380
axios封装错误请求函数
在使用axios作为请求工具时我们通常不在catch中对错误操作进行处理,我们可以将请求错误的操作放在响应拦截器中进行,日常开发只需要在then做业务即可。
用户6256742
2022/07/06
1.2K0
多线程循环顺序处理的方式
核心点: 1.锁共同资源lock 2.通过while循环判断每次被唤醒是否要再次阻塞
名字是乱打的
2021/12/24
5840
循环队列的顺序存储结构Java
在上次,我们讲到的是,队列的顺序存储结构也是由ArrayList实现的,从此就可以看出,在入队时候的时间复杂度为O(1),但是在出队时候的时间复杂度为O(n),这是因为,每次在出队后要将数组后面的有效元素前移一位。 所以,这里就会用到循环队列,显然,这种队列也是顺序存储结构,在这个循环队列中也会去实现接口Queue。 首先,我们要想到的是如何将一般的队列改变为循环队列。
全栈程序员站长
2022/08/29
7730
循环队列的顺序存储结构Java
一比一还原axios源码(五)—— 拦截器
  上一篇,我们扩展了Axios,构建了一个Axios类,然后通过这个Axios工厂类,创建真正的axios实例。那么今天,我们来实现下Axios的拦截器也就是interceptors。我们来简单看下Axios的interceptors的API:
zaking
2022/05/10
7860
一比一还原axios源码(五)—— 拦截器
刚出锅的 Axios 网络请求源码阅读笔记
Axios是一款基于 Promise 并可用于浏览器和 Node.js 的网络请求库。
小东同学
2022/07/29
1.5K0
刚出锅的 Axios 网络请求源码阅读笔记
[PHP] php中的索引数组和数组顺序问题
先上结论 , php的索引数组不是传统的从0开始的整数索引数组 , 而是一个关联数组 , 是一个有序的键值对 ,这个序就是定义时候的顺序
唯一Chat
2021/04/25
9.3K0
【前端探索】告别烂代码!用责任链模式封装网络请求
用vue开发web页面的时候,axios几乎是必选的网络框架,我们有时候需要在请求发出前和收到响应后,对数据做一些处理,这时候就会用到axios的拦截器,如果拦截器中我们需要处理的逻辑太过复杂,有什么方案可以优化么?
luciozhang
2023/04/22
5640
【前端探索】告别烂代码!用责任链模式封装网络请求
数组常用循环
对于JS我们常见的循环有下面这些: for 循环 for in 循环 for of 循环 forEach() map() filter() some() every() 下面要循环的数组 var arr = ['a', 'b', 'c']; 1、for 循环 for (var i = 0; i < arr.length; i++) { console.log(arr[i]) } 2、for in 循环 for (var i in arr) { cons
用户6973020
2020/02/24
1.4K0
数组循环左移
/* 功能:数组循环左移 日期:2013-05-20 */ #include <stdio.h> #include <stdlib.h> #include <math.h> #define LEN 6
WindCoder
2018/09/19
1.6K0

相似问题

用redux响应本机axios api调用

21

Axios调用中的Joi验证没有给出正确的响应

111

用Axios返回具有多个响应的数组

13

用Axios和承诺循环API调用

24

如何使Axios用Rails调用json响应?

31
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文