首页 > 解决方案 > 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会显示此错误。

在此处输入图像描述

那么,如何将共享首选项中的数据传递到另一个屏幕?

标签: androiddartflutter

解决方案


您的代码不会检查 _user 变量是否不为空。

您可以做的一件事是仅当 _user 不为空时才启用该按钮。因此,您确定您只使用非空用户调用第二页。

     onPressed: _user != null ? (){
        Navigator.push(
          context, 
          MaterialPageRoute(
            builder: (context)=> Screen2(user: _user)
          )
        );
     } : null,

推荐阅读