Почему, когда я переключаю страницу с помощью 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'),
);
}
В вашем случае вы используете два виджета приложения:
Но вы должны использовать только 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, где ваша тема не настроена, и запускаете новый экран с темой по умолчанию.
Чтобы решить эту проблему, у вас есть два варианта:
Я предпочитаю второй вариант:
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...
}
}
Я действительно не понимаю. Ваш код выглядит иначе... однако я безуспешно пытался реализовать ваше решение.
я обновил ответ
хорошо, спасибо большое. теперь понятно и работает.
Вы используете два класса 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(),
);
}
код, который вы используете для переключения темы