#android #flutter #dart
Вопрос:
у меня есть список элементов в моем приложении. каждый элемент приведет к другой странице, как я могу сохранить имя класса в переменной. если есть какое-либо другое решение моей проблемы, я с радостью приму его. Спасибо
это код элемента моего списка
ItemMenu(
image: "assets/images/logo.png",
title: "Agama",
page: "Agama_page()",
),
ItemMenu(
image: "assets/images/logo.png",
title: "Gender",
page: "Gender_page()",
),
ItemMenu(
image: "assets/images/logo.png",
title: "Geografi",
page: "Geografi_page()",
)
и это класс для кода меню пункта
class ItemMenu extends StatelessWidget {
final String image;
final String title;
final String page;
const ItemMenu({
Key key,
this.image,
this.title,
this.page,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
Get.to(() => page));
},
child: Container(
padding: EdgeInsets.all(10),
// width: 100,
margin: EdgeInsets.only(right: 20, bottom: 10, top: 10),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
color: Colors.white,
boxShadow: [
BoxShadow(
offset: Offset(0, 10),
blurRadius: 20,
color: Color(0xFF4056C6).withOpacity(.15),
)
]),
child: Column(
children: <Widget>[
Image.asset(
image,
height: 90,
),
Text(
title,
style: TextStyle(fontWeight: FontWeight.bold),
)
],
),
),
);
}
}
Комментарии:
1. В
if
else
коде, который вы показали, не используется, поэтому неясно, о чем вы просите.2. хорошо, я отредактировал вопрос
3. Все еще неясно, о чем вы просите. Какое отношение имеет сохранение имени класса в переменной к опубликованному вами коду? Чего вы пытаетесь достичь?
4. ответ мухаммеда али раза соответствует моему вопросу, но я хочу получить другое решение, помимо использования if else, потому что, на мой взгляд, оно неэффективно, если слишком много элементов
Ответ №1:
Ваш вопрос был неясен, но в вашем коде я видел, что вы неправильно выполняете навигацию.
вы даете строку вместо виджета для Get.to() метод.
попробуйте обновить свой код следующим образом.
class ItemMenu extends StatelessWidget {
final String image;
final String title;
final String page;
const ItemMenu({
Key key,
this.image,
this.title,
this.page,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
//! change this part in your code
//Get.to(() => page)); <- change this
if(page == 'Agama_page()'){ // <- to this
Get.to(() => AgamaPage());
}
//TODO: do the rest off you navigation below
},
child: Container(
padding: EdgeInsets.all(10),
// width: 100,
margin: EdgeInsets.only(right: 20, bottom: 10, top: 10),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
color: Colors.white,
boxShadow: [
BoxShadow(
offset: Offset(0, 10),
blurRadius: 20,
color: Color(0xFF4056C6).withOpacity(.15),
)
]),
child: Column(
children: <Widget>[
Image.asset(
image,
height: 90,
),
Text(
title,
style: TextStyle(fontWeight: FontWeight.bold),
)
],
),
),
);
}
}
// and of course create separate screen for every navigation
class AgamaPage extends StatelessWidget{
@override
Widget build(BuildContext context) {
return Scaffold(
body:Center(child:Text('AgamaPage')) );
}
или вы можете определить маршруты и использовать Get.toNamed()
Комментарии:
1. спасибо, я уже использовал этот метод раньше, но когда у меня много предметов, он, на мой взгляд, неэффективен, есть ли какой-нибудь другой способ, кроме как если бы еще
2. вы можете заменить if else оператором switch и преобразовать строки в перечисления, но, на мой взгляд, определите маршруты в GetMaterialApp в main и используйте метод Get.toNamed() для навигации.
Ответ №2:
Вы можете задать тип обратного вызова страницы параметров
ItemMenu(
image: "assets/images/logo.png",
title: "Agama",
page: () => Agama_page(),
),
//...
class ItemMenu extends StatelessWidget {
//...
final Widget Function() page
...
=== обновите полный класс
class ItemMenu extends StatelessWidget {
final String image;
final String title;
final Widget Function() page;
const ItemMenu({
Key key,
this.image,
this.title,
this.page,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
Get.to(page);
},
child: Container(
padding: EdgeInsets.all(10),
// width: 100,
margin: EdgeInsets.only(right: 20, bottom: 10, top: 10),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
color: Colors.white,
boxShadow: [
BoxShadow(
offset: Offset(0, 10),
blurRadius: 20,
color: Color(0xFF4056C6).withOpacity(.15),
)
]),
child: Column(
children: <Widget>[
Image.asset(
image,
height: 90,
),
Text(
title,
style: TextStyle(fontWeight: FontWeight.bold),
)
],
),
),
);
}
}
Комментарии:
1. можете ли вы полностью написать код для класса itemmenu? потому что я все еще в замешательстве