Как создать несколько BuildContext внутри виджета - PullRequest
0 голосов
/ 25 марта 2020

Это мой код

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

, и мне нужно просто иметь возможность изменить этот контекст , чтобы выбрать страницу, вместо создания большого количества виджетов .

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

как создание 2 или более дел в этом ...

builder: (context) => DashBoardScreen

Просто в качестве примера:

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

Спасибо, ребята. ..

1 Ответ

0 голосов
/ 25 марта 2020

1. Я думаю, что проблема в

То, что вы хотите, не на 100% ясно из вопроса, но я думаю, что вы просто хотите, чтобы функция, которая имела бы switch внутри, возвращала бы, какую страницу пользователь должен go ?

В этом случае вы можете проверить:

2. Одно из возможных решений

  1. Создание функции switch для определения, на какую страницу переключаться. Вместо использования String с, я настоятельно рекомендую использовать enum с. Но оба варианта возможны.

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

    Обратите внимание, что если у вас есть непустое предложение case, оканчивающееся на return, throw или continue, вам не нужен break. Предложение default не требует break.

  2. Возвращать экран при маршрутизации, вызывая функцию switcher - очевидно, вы можете создать дополнительные параметры для функций, если необходимо -:
    Widget homeDashBoardCards(title, image, Screens screenEnum, BuildContext context) {
      return GestureDetector(
        onTap: () => Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => screenSwitcher(screenEnum),
          ),
        ),
      );
    }
    

3. Дальнейшее чтение

Ваш код будет намного проще и проще для чтения, если вы будете использовать Named Routing , как упомянуто в первом разделе этого ответа. Кроме того, если маршрутизация очень важна для вашего приложения и сложна, вы можете рассмотреть возможность поиска или создания пакета на хосте пакета pub.dev .

Если вы принимаете код решения Я поделился выше, вы передаете переменные через разные виджеты, которые не очень объектно-ориентированы, а также не Flutter. Затем вы должны рассмотреть возможность обмена пакетами состояния, чтобы обойти это. Двумя наиболее заметными из них являются пакеты BLo C и Provider , но вы также можете сделать это с помощью rxdart и пакета get_it, отметьте это видео от Fireship для отличного резюме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...