如何解决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();
}
我有这个错误
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();
}