android - Flutter - 从 SharedPreferences 传递的数据显示为 null
问题描述
所以我有2个屏幕。在屏幕 1 上,我从 SharedPreferences 中检索了一个编码的 JSON,并且我有一个按钮可以导航到屏幕 2 并传递检索到的数据。但在屏幕 2 上,数据一直显示为空。当前一个小部件的状态更新时,小部件不是要更新吗?
屏幕 1
import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';
import 'screen2.dart';
class ScreenA extends StatefulWidget {
@override
_ProfileState createState() => new _ScreenAState();
}
class _ScreenAState extends State<Profile> {
Map _user;
@override
void initState() {
_getUser();
super.initState();
}
Future<bool> _getUser() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
String result = prefs.getString("user") ?? "";
if(result != ""){
setState(() {
_user = json.decode(result);
});
}
return true;
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body: Container(
child: RaisedButton(
child: Text("Go to Screen 2"),
onPressed: (){
Navigator.push(
context,
MaterialPageRoute(
builder: (context)=> Screen2(user: user)
)
);
}
)
)
)
}
}
屏幕 2
import 'package:flutter/material.dart';
class Screen2 extends StatefulWidget {
Screen2({this.user});
final Map user;
@override
_Screen2State createState() => new _Screen2State();
}
class _Screen2State extends State<Screen2> {
Map _user;
@override
void initState() {
_user = widget.user;
super.initState();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body: Text(_user["name"])
);
}
}
但是,当我单击此错误中的按钮时,ScreenA
会显示此错误。
那么,如何将共享首选项中的数据传递到另一个屏幕?
解决方案
您的代码不会检查 _user 变量是否不为空。
您可以做的一件事是仅当 _user 不为空时才启用该按钮。因此,您确定您只使用非空用户调用第二页。
onPressed: _user != null ? (){
Navigator.push(
context,
MaterialPageRoute(
builder: (context)=> Screen2(user: _user)
)
);
} : null,
推荐阅读
- c# - JsonConvert 库无法序列化 json
- javascript - 订阅更改,但需要从使用 Service 的位置查看变量?
- python - 字母组合作为python中的参数
- xpath - 从其后代的文本中获取一个元素
- react-apollo - orderBy:更新缓存查询的结果
- c# - UI 在 Image 控件加载 BitmapImage 时冻结
- javascript - 将事件从一个函数传递到另一个名为 agiant XMLHttpRequest.onreadystatechange 的内联函数
- c++ - 赋值运算符的奇怪行为
- android - Android API 26 SecurityException 问题
- batch-file - Taskkill:我需要多次指定 \t 参数吗?