如何在 static class 中传递上下文或任何参数?
How to pass context or any parameter in a static class in flutter?
我目前正在使用 pagewise 包实现分页。但是要使用 pagecontroller
,我必须定义一个静态控制器和静态 future 函数,它们将使用 http 连接到我的 api。我的问题是,我还需要当前用户 ID 作为使用提供程序检索的 API 请求中的参数。而且我还需要 BuildContext 在 API 请求 return 上显示对话框。是否可以像下面的示例代码那样将 id 和上下文保存在全局或 class 之外?请教我如何以正确的方式做到这一点。
int id;
BuildContext currentContext;
class MyWidgetView extends StatefulWidget {
@override
_MyWidgetViewState createState() => _MyWidgetViewState();
}
class _MyWidgetViewState extends State<MyWidgetView> {
bool _empty = false;
@override
void initState() {
super.initState();
currentContext = context;
id = Provider.of<User>(context, listen: false).id;
this._pageLoadController.addListener(() {
if (this._pageLoadController.noItemsFound) {
setState(() {
this._empty = this._pageLoadController.noItemsFound;
});
}
});
}
final _pageLoadController = PagewiseLoadController(
pageSize: PAGE_SIZE, pageFuture: (pageIndex) => getPage(pageIndex));
static Future<List<page>> getPage(int pageIndex) async {
final APIService _pageService = APIService();
final pages = await _pageService.getPage(id: id);
if (pages.error == false) {
return pages.data;
} else {
dialogBox(
title: 'Error',
message: pages.errorMessage,
context: currentContext,
isModal: true,
function: () => Navigator.pop(currentContext));
}
}
那个 static
是一个你不应该跟随的兔子洞。一开始就不要static
。
PagewiseLoadController _pageLoadController;
@override
void initState() {
super.initState();
_pageLoadController = PagewiseLoadController(pageSize: PAGE_SIZE, pageFuture: (pageIndex) => getPage(pageIndex));
// rest of your method here
}
现在您的 getPage
方法可以是一个普通的 non-static class 方法。
我目前正在使用 pagewise 包实现分页。但是要使用 pagecontroller
,我必须定义一个静态控制器和静态 future 函数,它们将使用 http 连接到我的 api。我的问题是,我还需要当前用户 ID 作为使用提供程序检索的 API 请求中的参数。而且我还需要 BuildContext 在 API 请求 return 上显示对话框。是否可以像下面的示例代码那样将 id 和上下文保存在全局或 class 之外?请教我如何以正确的方式做到这一点。
int id;
BuildContext currentContext;
class MyWidgetView extends StatefulWidget {
@override
_MyWidgetViewState createState() => _MyWidgetViewState();
}
class _MyWidgetViewState extends State<MyWidgetView> {
bool _empty = false;
@override
void initState() {
super.initState();
currentContext = context;
id = Provider.of<User>(context, listen: false).id;
this._pageLoadController.addListener(() {
if (this._pageLoadController.noItemsFound) {
setState(() {
this._empty = this._pageLoadController.noItemsFound;
});
}
});
}
final _pageLoadController = PagewiseLoadController(
pageSize: PAGE_SIZE, pageFuture: (pageIndex) => getPage(pageIndex));
static Future<List<page>> getPage(int pageIndex) async {
final APIService _pageService = APIService();
final pages = await _pageService.getPage(id: id);
if (pages.error == false) {
return pages.data;
} else {
dialogBox(
title: 'Error',
message: pages.errorMessage,
context: currentContext,
isModal: true,
function: () => Navigator.pop(currentContext));
}
}
那个 static
是一个你不应该跟随的兔子洞。一开始就不要static
。
PagewiseLoadController _pageLoadController;
@override
void initState() {
super.initState();
_pageLoadController = PagewiseLoadController(pageSize: PAGE_SIZE, pageFuture: (pageIndex) => getPage(pageIndex));
// rest of your method here
}
现在您的 getPage
方法可以是一个普通的 non-static class 方法。