Пакет getX flutter использует стиль темы по умолчанию вместо моей пользовательской темы

Почему, когда я переключаю страницу с помощью Get(()=> Page2 пакета getX, приложение возвращается к цветам темы по умолчанию? У меня есть пользовательская тема с желтым цветом, но затем она возвращается к синему цвету по умолчанию. Я что-то упускаю?

мой код

appBar: AppBar(
    title: Text('Profile'),
    actions: [
      IconButton(
        icon: Icon(Icons.edit_note_outlined), onPressed: () {
          setState(() {
            /*isVisible= !isVisible;
            isReadOnly = !isReadOnly;*/
          });
          Get.to(
              AddNewProduct(),
              duration: Duration(milliseconds: 300),
              transition: Transition.fade
          );
      },
      ),
    ],
  ),

мой основной

   Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(GetMaterialApp(
      home: const MyApp(),)
  );
}

моя пользовательская тема

@override
   Widget build(BuildContext context) {
     return MaterialApp(
       title: 'Flutter app',
       theme: ThemeData(
         primarySwatch: Colors.amber,
         buttonTheme: ButtonTheme.of(context).copyWith(
           textTheme: ButtonTextTheme.primary,
           shape: RoundedRectangleBorder(
               borderRadius: BorderRadius.circular(25.0)
           ),
         )
       ),
       home: const MyHomePage(title: 'Home'),
     );
    }

код, который вы используете для переключения темы

Dev 18.11.2022 07:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
83
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

В вашем случае вы используете два виджета приложения:

  • GetMaterialApp в корне
  • MaterialApp в MyApp

Но вы должны использовать только GetMaterialApp.

В вашей функции main удалите GetMaterialApp

runApp(const MyApp(),);

В виджете MyApp замените MaterialApp на GetMaterialApp

@override
Widget build(BuildContext context) {
    return GetMaterialApp(
      title: 'Flutter app',
      theme: ThemeData(
          primarySwatch: Colors.amber,
          buttonTheme: ButtonTheme.of(context).copyWith(
            textTheme: ButtonTextTheme.primary,
            shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.circular(25.0)
            ),
          )
      ),
      home: const MyHomePage(),
    );
  }

ОТВЕТ, КОТОРЫЙ ЗАВИСИТ ОТ КОНТЕКСТА

Давайте посмотрим на структуру вашего дерева виджетов

GetMaterialApp
  Builder (context1)
    MaterialApp <-- here you are setup your theme
     Scaffold
        AppBar
           Navigator.of(context1).push(MaterialPageRoute(builder: (_) => AddNewProduct()));
        body: ...

Как вы можете видеть, когда вы переходите к экрану AddNewProduct, вы запрашиваете контекст из виджета Builder, где ваша тема не настроена, и запускаете новый экран с темой по умолчанию.

Чтобы решить эту проблему, у вас есть два варианта:

  • оберните Scaffold другим виджетом Builder
  • вынести все, что связано со свойством body, в отдельный виджет

Я предпочитаю второй вариант:

runApp(GetMaterialApp(home: Builder(builder: (context) {
    return MaterialApp(
      title: 'Flutter app',
      theme: ThemeData(
          primarySwatch: Colors.amber,
          buttonTheme: ButtonTheme.of(context).copyWith(
            textTheme: ButtonTextTheme.primary,
            shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.circular(25.0)),
          )),
      home: const HomeWidget(),
    );
  })));

И ваш HomeWidget:

class HomeWidget extends StatelessWidget {
  const HomeWidget({
    Key? key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Profile'),
          actions: [
            IconButton(
              icon: Icon(Icons.edit_note_outlined),
              onPressed: () {
                Navigator.of(context)
                    .push(MaterialPageRoute(builder: (_) => AddNewProduct()));
              },
            ),
          ],
        ),
        body: ... your content here...
  }
}

Я действительно не понимаю. Ваш код выглядит иначе... однако я безуспешно пытался реализовать ваше решение.

Giovanni 18.11.2022 08:33

я обновил ответ

powerman23rus 18.11.2022 09:04

хорошо, спасибо большое. теперь понятно и работает.

Giovanni 18.11.2022 09:55

Вы используете два класса MaterialApp. «Нормальный» и GetMaterialApp. Вы должны избавиться от обычного и перенести все параметры в GetMaterialApp. GetMaterialApp заменяет MaterialApp. Так нравится

   Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(GetMaterialApp(
       title: 'Flutter app',
       theme: ThemeData(
         primarySwatch: Colors.amber,
         buttonTheme: ButtonTheme.of(context).copyWith(
           textTheme: ButtonTextTheme.primary,
           shape: RoundedRectangleBorder(
               borderRadius: BorderRadius.circular(25.0)
           ),
         )
       ),
       home: const MyHomePage(title: 'Home'),  );
}

Вероятно, вам больше не нужен ваш MyApp класс. Или, альтернативно, замените MaterialApp в MyApp на GetMaterialApp и удалите его из основного списка лайков.

  runApp(const MyApp());

изменение

 Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(GetMaterialApp(
      home: const MyApp(),)
  );
}

к

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(GetMaterialApp(
theme: ThemeData(
         primarySwatch: Colors.amber,
         buttonTheme: ButtonTheme.of(context).copyWith(
           textTheme: ButtonTextTheme.primary,
           shape: RoundedRectangleBorder(
               borderRadius: BorderRadius.circular(25.0)
           ),
         )
       ),
      home: const MyApp(),)
  );
}

Не используйте *GetMaterialApp(* в сборке используйте Scaffold

Вы используете 2 класса материалов.

-> Материал Приложение

-> ПолучитьМатериалПриложение

Удалить GetMaterialApp из основного класса

runApp(const MyApp(),);

И замените MaterialApp на GetMaterialApp в виджете MyApp.

@override
Widget build(BuildContext context) {
    return GetMaterialApp(
      title: 'Flutter app',
      theme: ThemeData(
          primarySwatch: Colors.amber,
          buttonTheme: ButtonTheme.of(context).copyWith(
            textTheme: ButtonTextTheme.primary,
            shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.circular(25.0)
            ),
          )
      ),
      home: const MyHomePage(),
    );
  }

Другие вопросы по теме