如何解决Class '_InternalLinkedHashMap<String, dynamic>' has no instance getter 'uid'

How to solve Class '_InternalLinkedHashMap<String, dynamic>' has no instance getter 'uid'

我有这个错误

I/flutter (12204): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (12204): The following NoSuchMethodError was thrown building FutureBuilder<Map<String, dynamic>>(dirty,
I/flutter (12204): dependencies: [Provider], state: _FutureBuilderState<Map<String, dynamic>>#0ec0c):
I/flutter (12204): Class '_InternalLinkedHashMap<String, dynamic>' has no instance getter 'uid'.
I/flutter (12204): Receiver: _LinkedHashMap len:3
I/flutter (12204): Tried calling: uid
I/flutter (12204):
I/flutter (12204): The relevant error-causing widget was:
I/flutter (12204):   FutureBuilder<Map<String, dynamic>> file:///D:/Projects/Davrick/curtain/lib/main.dart:26:15

当我 运行 我的应用程序。这是一个社交媒体应用程序,所以我需要在用户登录时获取用户 ID 并将其用于其他用途(比如显示他们的图片和消息等)。 首先,我使用 Firebase 构建了这个应用程序(这很简单))。现在我正在使用 Django REST 框架,但出现了一些错误。

下面是我的 main.dart 代码:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Provider(
      child: MaterialApp(
        title: 'Curtain App',
        home: FutureBuilder(
          future: AuthService.getToken(),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return Container();
            }
            if (snapshot.hasData) {
              Provider.of<UserData>(context).currentUserId = snapshot.data.uid; //this line is giving error
              return HomeScreen();
            } else {
              return LoginScreen();
            }
          },
        ),
        routes: {
          LoginScreen.id: (context) => LoginScreen(),
          SignupScreen.id: (context) => SignupScreen(),
          FeedScreen.id: (context) => FeedScreen(),
        },
      ),
    );
  }
}

这是AuthService的代码class

static Future<dynamic> loginUser(String username, String password) async {
    
    print(username);
    print(password);
    final result = await http.post('$baseURL/en/users/login/', headers: {
      'Accept': 'application/json',
    }, body: {
      'username': username,
      'password': password,
    });

    return result?.body;
  }

  static setToken(String token, String refreshToken) async {
    _AuthData data = _AuthData(token, refreshToken);
    await SESSION.set('tokens', data);
  }

  static Future<Map<String, dynamic>> getToken() async {
    return await SESSION.get('tokens');
  }

  static removeToken() async {
    await SESSION.prefs.clear();
  }

这是 _AuthData class

class _AuthData {
  String token, refreshToken;
  _AuthData(this.token, this.refreshToken);

  // toJson
  // required by Session lib
  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = Map<String, dynamic>();

    data['token'] = token;
    data['refreshToken'] = refreshToken;

    return data;
  }
}

我还需要说明一下,我的供应商 class 是定制的。 请帮助解决这个问题。 谢谢。

您正在从 Future 中检索 Map<String, dynamic>,而此 class 不包含 uid 字段。您应该通过类似于此的方式解析来自服务器的响应:

static Future<String> getToken() async {
  // Parse auth data that you needs here and return token only
}

并且在 FutureBuilder 中(我被添加 CircularProgressIndicator 当向用户显示一些加载小部件而不是空 Container 更好时):

if (!snapshot.hasData) {
  return CircularProgressIndicator();
}
if (snapshot.hasData) {
  Provider.of<UserData>(context).currentUserId = snapshot.data;
  return HomeScreen();
} else {
  return LoginScreen();
}