SharedPreferences 在 null 颤动上调用
Posted
技术标签:
【中文标题】SharedPreferences 在 null 颤动上调用【英文标题】:SharedPreferences called on null flutter 【发布时间】: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 行。错误是连续发生还是仅发生几次?你能提供管理页面代码吗?
【参考方案1】:
可能是因为 jwToken 在初始化时为空。尝试给 jwToken 一个字符串值,例如“test”。
【讨论】:
问题中的问题解决了,看问题上的cmets。 用 Possibly 和 Try 的答案似乎不是一个答案,只是一个建议 是的,但找到答案通常需要尝试可能的解决方案并经历消除过程。【参考方案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();
【讨论】:
以上是关于SharedPreferences 在 null 颤动上调用的主要内容,如果未能解决你的问题,请参考以下文章