flutter — как сохранить класс в переменной

#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? потому что я все еще в замешательстве