FutureBuilder :“需要一个类型为‘Future<Map<dynamic, dynamic>>?’的值,但得到了一个类型为‘_JsonMap’的值”

时间:2021-04-12 03:14:53

标签: flutter future flutter-futurebuilder

在尝试将 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},');

                }
            }
          })),

    

    ]
    );
  }}

0 个答案:

没有答案