在尝试将 Future-Map 传递给 future builder 小部件时,会出现以下错误。
已使用 cast-as
运算符将 JsonMap 转换为 Future-Map,并且已使用 Future.value()
返回值,但以下错误仍然存在。
更多详情:
如果 sharedpreferences 中的值未初始化,则构建器应该获得这些初始值。
然而,在传递 Mapped 初始值时,Flutter 不会将返回的 _JsonMap 视为 Future-Map 并给出以下错误。
如何将_JsonMap 转换为 Future-Map ?
错误:
Expected a value of type 'Future<Map<dynamic, dynamic>>?', but got one of type '_JsonMap'
代码:
import 'dart:convert';
import 'dart:js';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
class User{
String name;
int age;
bool subscribed;
User({this.name, this.age, this.subscribed});
}
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'JsonMap',
theme: ThemeData.dark(),
home: Scaffold(
appBar: AppBar(
title: Text(
'SharedPreferences returns null values',
style: TextStyle(),
),
),
body: UserScreen1(),
// body: UserScreen1( sessionDataScreen1 : _sessionDataMain ),
),
);
}
}
class UserScreen1 extends StatefulWidget {
@override
_UserScreen1State createState() => _UserScreen1State();
}
class _UserScreen1State extends State<UserScreen1> {
=
User _user = User();
var _mapGet;
var _mapSet;
final _formKey = GlobalKey<FormState>();
Future<Map<dynamic, dynamic>> _getSharedPreferences (_userDataKey) async {
var _userJsonInitial = '''{
"name" : "Mock",
"age" : 20,
"subscribed" : true}''';
final prefs = await SharedPreferences.getInstance();
final rawJsonGet = prefs.getString(_userDataKey) ?? _userJsonInitial;
_mapGet = await jsonDecode(rawJsonGet) as Future<Map<dynamic,dynamic>>;
print('_mapGet = $_mapGet ');
_mapGet.forEach((k, v) => print('${k}: ${v}'));
// return Future<Map<String, dynamic>>.from(json.decode(rawJsonGet));
return Future.value(_mapGet);
}
void initState() {
super.initState();
_mapGet = _getSharedPreferences ('_userDataKey');
_mapGet.then((_mapGet){
setState(() {
_user = User(name : _mapGet['name'], age : _mapGet['age'], subscribed : _mapGet['subscribed']);
print(' User InitState : name = ${_user.name}, age = ${_user.age},subscribed = ${_user.subscribed},');
});});
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center ,
children: [
Container(child:FutureBuilder<Map>(
future: _mapGet,
builder: (BuildContext context, AsyncSnapshot<Map> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return const CircularProgressIndicator();
default:
if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else {
// return Text(' User (BuildContext) : name = ${snapshot.data.['name']}, age = ${snapshot.data['age']},subscribed = ${snapshot.data['subscribed']},');
return Text(' User (BuildContext) : nameMap = ${snapshot.data} , nameUser = ${_user.name},');
}
}
})),
]
);
}}