【问题标题】:SharedPreferences called on null flutterSharedPreferences 在 null 颤动上调用
【发布时间】:2019-08-17 19:42:31
【问题描述】:

我构建了一个函数,用于将令牌存储在共享首选项中,然后在我第一次运行我的应用程序出现错误时从服务器获取数据

在构建 AdminPage(dirty, 状态:AdminPageState#87bcd):颤振:方法“[]”被调用 空值。颤振:接收者:空颤振:尝试调用:

然后应用就可以正常工作了

附:我的代码是这样的

Future<Map<String, dynamic>> getCards(String userid) async {
  BuildContext context;
  String jWTtoken = '';
  try {
    final SharedPreferences prefs = await SharedPreferences.getInstance();

    //  prefs = await SharedPreferences.getInstance();
    jWTtoken = prefs.getString('token');
    tokenfoo();
  } catch (e) {
    Navigator.pushReplacement(
      context,
      MaterialPageRoute(builder: (BuildContext context) => AuthPage()),
    );
  }

  final Map<String, dynamic> authData = {
    'Userid': '261',
    // 'Email':_formData['Email'],
    // 'Password':_formData['Password'],
  };

  final http.Response response = await http.post(
      'hurl',
      body: json.encode(authData),
      headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + jWTtoken
      });

  final Map<String, dynamic> responseData = json.decode(response.body);

  if (responseData["StatusCode"] == 200) {

    null;
  
  } else if (responseData["StatusCode"] == 401) {
    print(responseData);
    Logout();
  } else {
    print(responseData);
    Logout();

    null;
  }
  return responseData;
}

有什么穿的吗?

在调试模式下,错误出现在这一行

 final SharedPreferences prefs = await SharedPreferences.getInstance();

错误:

══╡ 小部件库发现异常 ╞═════════════════════════════════════════════════ ══════════颤动: 在构建 AdminPage(dirty, 状态:AdminPageState#7db9a):颤振:方法“[]”被调用 空值。颤振:接收者:空颤振:尝试调用:颤振: flutter: 当异常被抛出时,这里是栈:flutter:

0 Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:50:5) 颤振:#1

AdminPageState.build (package:idb/pages/adminpage.dart:63:39) 颤振:

2 StatefulElement.build (package:flutter/src/widgets/framework.dart:3809:27) 颤振:#3

ComponentElement.performRebuild (包:flutter/src/widgets/framework.dart:3721:15) 颤振:#4
Element.rebuild (包:flutter/src/widgets/framework.dart:3547:5) 颤振:#5 ComponentElement._firstBuild (包:flutter/src/widgets/framework.dart:3701:5) 颤振:#6
StatefulElement._firstBuild (包:flutter/src/widgets/framework.dart:3848:11) 颤振:#7
组件元素.mount (包:flutter/src/widgets/framework.dart:3696:5) 颤振:#8
Element.inflateWidget (包:flutter/src/widgets/framework.dart:2950:14) 颤振:#9
元素.updateChild (包:flutter/src/widgets/framework.dart:2753:12)颤振:#10
ComponentElement.performRebuild (包:flutter/src/widgets/framework.dart:3732:16)颤振:#11
Element.rebuild (包:flutter/src/widgets/framework.dart:3547:5) 颤振:#12 BuildOwner.buildScope (包:flutter/src/widgets/framework.dart:2286:33)颤振:#13
_WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:676:20) 颤振:#14
_WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (包:flutter/src/rendering/binding.dart:219:5) 颤振:#15
_WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (包:flutter/src/scheduler/binding.dart:990:15) 颤振:#16
_WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:930:9) 颤振:#17
_WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:842:5) 颤振:#18
_invoke (dart:ui/hooks.dart:154:13) 颤振:#19 _drawFrame (dart:ui/hooks.dart:143:3)

【问题讨论】:

  • 请发布堆栈跟踪!
  • 怎么做????
  • 你试过去掉最后一行的修饰符吗?进入决赛毫无意义。
  • 错误可能在jWTtoken = prefs.getString('token') 检查它。并发布你得到的完整错误。
  • 错误似乎在adminpage.dart 文件中,请参阅管理页面中的第 63 行。错误是连续发生还是仅发生几次?你能提供管理页面代码吗?

标签: dart flutter sharedpreferences


【解决方案1】:

可能是因为 jwToken 在初始化时为空。尝试给 jwToken 一个字符串值,例如“test”。

【讨论】:

  • 问题中的问题解决了,看问题上的cmets。
  • PossiblyTry 的答案似乎不是一个答案,只是一个建议
  • 是的,但找到答案通常需要尝试可能的解决方案并经历消除过程。
【解决方案2】:

发生这种情况是因为您没有在使用前对其进行初始化

为避免这种情况,您应该在 _MyAppState 类中的 _MyAppState 类中初始化 await SharedPref.init();,就像这样

class _MyAppState extends State<MyApp> {

  void initState() async {
    super.initState();
    await SharedPref.init();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      locale: _locale,
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: appThemeColor,
        accentColor: Colors.lightBlueAccent,
      ),
      home: SplashScreen(),
      builder: (BuildContext context, Widget child) {
        return child;
      },
    );
  }
}

创建一个全局类以全局使用

class SharedPref {
  static SharedPreferences pref;
  static Future init() async {
    pref = await SharedPreferences.getInstance();
  }
}

以后可以这样使用

SharedPref.pref.setBool("isLogin", true);

【讨论】:

    【解决方案3】:

    创建一个全局类以全局使用:

    final SharedPreferences prefs = await SharedPreferences.getInstance();
    
    static Future init() async {
        pref = await SharedPreferences.getInstance();
      }
    

    【讨论】:

      猜你喜欢
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 2021-05-29
      • 2023-04-08
      • 1970-01-01
      • 2020-01-21
      相关资源
      最近更新 更多