如何在小部件内创建多个 BuildContext

How to create multiple BuildContext inside widget

这是我的代码

Widget homeDashBoardCards(title, image, BuildContext context) {
  return GestureDetector(
    onTap: () => Navigator.push(
      context,
      MaterialPageRoute(
        builder: (context) => DashBoardScreen(),
      ),
    ),
  );
}

我只需要能够更改此 context 以选择页面,而不是创建大量 Widgets

homeDashBoardCards('Categories', 'chii-icon.png', context),

喜欢在这个案例中创建 2 个或更多案例...

builder: (context) => DashBoardScreen

举个例子:

builder: (context) => case "1" = DashBoardScreen
                      case "2" = FavoriteScreen

谢谢大家...

1。我认为问题是什么

你想要的不是 100% 从问题中清楚,但我认为你只是想要一个函数,里面有一个 switch 返回用户应该去哪个页面?

在这种情况下,您可能需要查看:

2。一种可能的解决方案

  1. 创建一个 switch 函数来决定要切换到哪个页面。我强烈建议不要使用 Strings,而是使用 enums。但两者皆有可能。

    enum Screens {dashboard, favorite}
    
    Widget screenSwitcher(Screens screenEnum) {
      switch (screenEnum) {
        case Screens.dashboard:
          return DashBoardScreen();
        case Screens.favorite:
          return FavoriteScreen();
        default:
          throw Exception;
      }
    }
    

    请注意,如果您有一个以 returnthrowcontinue 结尾的非空 case 子句,则不需要 breakdefault 子句不需要 break.

  2. Return 通过调用切换器函数进行路由时的屏幕 — 如果需要,您显然可以为函数创建更多参数 —:
    Widget homeDashBoardCards(title, image, Screens screenEnum, BuildContext context) {
      return GestureDetector(
        onTap: () => Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => screenSwitcher(screenEnum),
          ),
        ),
      );
    }
    

3。延伸阅读

如果您使用命名路由,您的代码将更加简单易读,如本答案第一部分所述。此外,如果路由对您的应用非常重要且复杂,您可能需要考虑在 pub.dev 包主机中查找或创建包。

如果您接受我上面分享的解决方案代码,您将通过不同的小部件传递变量,这不是很面向对象,也不是 Flutter 方式。然后你应该考虑状态共享包来解决这个问题。最著名的两个是 Fireship 的 BLoC and the Provider packages, but you can also do it with rxdart and the get_it package, check this video 摘要。