Flutter - 不要跨异步间隙使用 BuildContexts
Flutter - Do not use BuildContexts across async gaps
在我的 flutter Api 中,我有如下代码,但 lint 2.0.1 在 Navigator.pushnamed(context
处警告我
Do not use BuildContext across async gaps
这个 有一些信息,但如果我尝试使用该解决方案,我会收到一个错误,提示 mounted is undefined。我不知道如何按照下面的答案将我的 Api class 转换为 StatefulWidget。
class Api {
Future<List<Author>> getAuthors(BuildContext context) async {
List<Author> authors = [];
try {
final response = await _helper.get(context, "/authors");
if (response.statusCode == 200) {
var parsed = json.decode(response.body);
if (parsed is List<dynamic>) {
for (var author in parsed) {
authors.add(Author.fromJson(author));
}
}
} else {
Navigator.pushNamed(context, RoutePaths.login);
return authors;
}
} catch (e) {
return authors;
}
return authors;
}
}
更改为 StatefulWidget 而不是 StatelessWidget。这将为您提供要使用的 mounted
变量。
编辑:
基于您的评论和您的第一次编辑。您之前将那段代码 (class Api
) 排除在外。现在它显示了您的代码中的一些结构性问题。您将 ui 代码与您的业务逻辑混合在一起。您在这里使用的是 BuildContext,它来自您的小部件!
不要在这里做路由。您不应该在此 class 中使用 BuildContext!我强烈反对这样做。但是,如果您愿意,请尝试将 mounted
标志从调用此“Api-class”的小部件传递到此 class,然后看看会发生什么。再一次,我强烈反对这样做。
在我的 flutter Api 中,我有如下代码,但 lint 2.0.1 在 Navigator.pushnamed(context
Do not use BuildContext across async gaps
这个
class Api {
Future<List<Author>> getAuthors(BuildContext context) async {
List<Author> authors = [];
try {
final response = await _helper.get(context, "/authors");
if (response.statusCode == 200) {
var parsed = json.decode(response.body);
if (parsed is List<dynamic>) {
for (var author in parsed) {
authors.add(Author.fromJson(author));
}
}
} else {
Navigator.pushNamed(context, RoutePaths.login);
return authors;
}
} catch (e) {
return authors;
}
return authors;
}
}
更改为 StatefulWidget 而不是 StatelessWidget。这将为您提供要使用的 mounted
变量。
编辑:
基于您的评论和您的第一次编辑。您之前将那段代码 (class Api
) 排除在外。现在它显示了您的代码中的一些结构性问题。您将 ui 代码与您的业务逻辑混合在一起。您在这里使用的是 BuildContext,它来自您的小部件!
不要在这里做路由。您不应该在此 class 中使用 BuildContext!我强烈反对这样做。但是,如果您愿意,请尝试将 mounted
标志从调用此“Api-class”的小部件传递到此 class,然后看看会发生什么。再一次,我强烈反对这样做。