首页 > 解决方案 > 如何修复共享首选项在 Flutter 中返回空字符串?

问题描述

我正在使用共享首选项在 Flutter中存储和加载 Map 的值,但出现错误

The following assertion was thrown building UserPro(dirty):
A non-null String must be provided to a Text widget.
'package:flutter/src/widgets/text.dart':
Failed assertion: line 360 pos 10: 'data != null'

我当然知道Shared Preferences 返回一个 null String value,但我不明白为什么,因为我正在等待该值。以及如何解决它。我附上我的代码和这个问题供您参考

----存储 ------

void setUserValues() async{
    SharedPreferences sharedPrefs = await SharedPreferences.getInstance();
    currentUser.forEach((k,v)=>sharedPrefs.setString(k, v));
  }

此处currentUser包含包含“姓名”、“电子邮件”等用户数据的地图。

----加载中 ------

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

SharedPreferences localStorage;


class UserPro extends StatelessWidget{
  final currentUser;

  String name;
  UserPro({this.currentUser}){
    name=localStorage.getString("Name");;
  }
  static Future init() async{
    localStorage = await SharedPreferences.getInstance();
  }
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      body: Center(
        child: Text(
            name,
            style: TextStyle(
              fontSize: 15,
              fontFamily: 'Berlin Sans FB',
              fontWeight: FontWeight.bold,
            ),
          ),
        ),
    );
  }
}

标签: androidfluttersharedpreferences

解决方案


使用 FutureBuilder

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

//SharedPreferences localStorage;


class UserPro extends StatelessWidget{
  final currentUser;

  //String name;
  UserPro({this.currentUser});
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      body: Center(
        child: FutureBuilder<SharedPreferences>(
             future: SharedPreferences.getInstance(),
             builder: (context,snapshot){
                if (!snapshot.hasData) {
                   return CircularProgressIndicator();
                  }
            return Text(
            snapshot.data.getString("name"),
            style: TextStyle(
              fontSize: 15,
              fontFamily: 'Berlin Sans FB',
              fontWeight: FontWeight.bold,
            ),
          ),
      },
   ),
    ),
    );
  }
}

推荐阅读