【问题标题】:Flutter - data passed from SharedPreferences showing as nullFlutter - 从 SharedPreferences 传递的数据显示为 null
【发布时间】:2018-10-12 14:24:02
【问题描述】:

所以我有 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 中的按钮时,会显示此错误。

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

【问题讨论】:

  • 你正在做Screen2(user: user),但你的变量是_user
  • 你想念等待 - String result = (await prefs.getString("user")) ?? "";

标签: android dart flutter


【解决方案1】:

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

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

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

【讨论】:

  • 这不是问题。该变量将始终为 null,因为它们使用了错误的变量(您的代码隐式地纠正了该变量)并且没有为 SharedPreferences 使用 await
  • 我假设这是一个错误输入,否则 IDE 会抱怨该变量不存在。
  • 我认为 Flutter 仍然会在缺少变量的情况下进行编译。
猜你喜欢
  • 1970-01-01
  • 2020-06-06
  • 2021-06-09
  • 1970-01-01
  • 2021-04-28
  • 2021-01-14
  • 2018-05-26
  • 1970-01-01
  • 2021-09-26
相关资源
最近更新 更多