【问题标题】:How to pass context or any parameter in a static class in flutter?如何在颤动的静态类中传递上下文或任何参数?
【发布时间】:2020-10-09 05:59:59
【问题描述】:

我目前正在使用pagewise 包实现分页。但要使用pagecontroller,我必须定义一个静态控制器和静态未来函数,它将使用http 连接到我的api。我的问题是,我还需要当前用户 ID 作为使用提供程序检索的 API 请求中的参数。而且我还需要 BuildContext 在 API 请求返回时显示对话框。像下面的示例代码一样,可以在全局范围内还是在类外部保存 id 和上下文?请教我如何正确地做到这一点。

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));
    }
  }

【问题讨论】:

  • "我必须定义一个静态控制器和静态未来函数" => 为什么?
  • @nvoig 当 _pageLoadController 未声明为静态时,我无法访问未来的 getPage 函数。这是错误Only static members can be accessed in initializers
  • 然后在构造函数中进行。或者你的 initState 方法。您在这里查看错误的解决方案。 static 不是解决您问题的方法,它只是一个更多问题。
  • @nvoigt 你能给我举个例子吗?我只是在关注分页插件文档。他们也使用静态。错误来自final _pageLoadController = PagewiseLoadController()

标签: flutter dart static-methods


【解决方案1】:

static 是一个你不应该遵循的兔子洞。只是一开始就不要static

PagewiseLoadController _pageLoadController; 

@override
void initState() {
  super.initState();

  _pageLoadController = PagewiseLoadController(pageSize: PAGE_SIZE, pageFuture: (pageIndex) => getPage(pageIndex));

  // rest of your method here    
}

现在您的getPage 方法可以是普通的非静态类方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多