Как перейти на соответствующие страницы сервиса при использовании навигатора с помощью индекса

#flutter #dart

Вопрос:

Приведенный ниже код переходит на соответствующую страницу служб (пример: «Экран домашней доставки», «Рабочий стол прачечной», «Рабочий стол сантехники»).


 GridTile(
      footer: ElevatedButton(
          onPressed: () {
            // Navigate to it's dedicated pages
            Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => ServiceDetailScreen(
                  service: services[index],
                ),
              ),
            );
          },
        );
 

Как мы можем динамически получить эти соответствующие страницы обслуживания («Экран домашней доставки», «Экран прачечной», «Экран подключения»)? как и в моем случае, каждая услуга представляет собой отдельный экран, как указано выше, а не строку ниже.

 class ServiceDetailScreen extends StatelessWidget {
  const ServiceDetailScreen({Key? key, required this.service})
      : super(key: key);

  final Service service;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(service.categoryName),
        actions: [
          IconButton(
            onPressed: () {},
            icon: Icon(Icons.notifications),
          ),
        ],
      ),
      body: Container(
        // ******************************************
        // How can we get these respective service pages ('HomeDeliveryScreen', 'LaundryServiceScreen', 'PlumbingServiceScreen') dynamically? as in my case, each service is a different screen as mentioned above instead of the below line.
        // ******************************************
        child: HomeDeliveryScreen(),
      ),
    );
  }
}
 

введите описание изображения здесь

Комментарии:

1. что определяет, на какую страницу происходит перенаправление?

2. Я хочу, чтобы при переходе к соответствующим сервисным страницам в методе GridTile «onPressed» я также хотел показать соответствующий экран службы. Во втором фрагменте кода у меня был жесткий код, который в основном показывал один и тот же экран для всех категорий услуг. Надеюсь, я смогу объяснить.

Ответ №1:

используйте GridView.builder также вы можете использовать data.asMap().map(....)

 GridView.builder(
            gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
                maxCrossAxisExtent: 200,
                childAspectRatio: 3 / 2,
                crossAxisSpacing: 20,
                mainAxisSpacing: 20),
            itemCount: widgets.length,
            itemBuilder: (BuildContext ctx, index) {
              final widget = widgets[index];
              final title = titles[index];
              
              return Column(children: [
                Text(title),
                Image.asset('yourImage'),
                ElevatedButton(
                  child: Text("to page"),
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(
                  builder: (context) => widget,
                ),
              );
            },
        ),
              ]);
            })
 

полный код

 void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark().copyWith(
        scaffoldBackgroundColor: Colors.white,
      ),
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: MyWidget(),
        ),
      ),
    );
  }
}

class MyWidget extends StatelessWidget {
  final List<Widget> widgets = [HomeDeliveryScreen(), LaundryServiceScreen(), PlumbingServiceScreen()];
  final List<String> titles = ['first', 'second', 'third'];
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(body: GridView.builder(
            gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
                maxCrossAxisExtent: 200,
                childAspectRatio: 3 / 2,
                crossAxisSpacing: 20,
                mainAxisSpacing: 20),
            itemCount: widgets.length,
            itemBuilder: (BuildContext ctx, index) {
              final widget = widgets[index];
              final title = titles[index];
              
              return Column(children: [
                Text(title),
                Image.asset('yourImage'),
                ElevatedButton(
                  child: Text("to page"),
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(
                  builder: (context) => widget,
                ),
              );
            },
        ),
              ]);
            }));
  }
}

class HomeDeliveryScreen extends StatelessWidget {
  Widget build(BuildContext context) {
    return Text('HomeDeliveryScreen');
  }
}


class LaundryServiceScreen extends StatelessWidget {
  Widget build(BuildContext context) {
    return Text('LaundryServiceScreen');
  }
}


class PlumbingServiceScreen extends StatelessWidget {
  Widget build(BuildContext context) {
    return Text('PlumbingServiceScreen');
  }
}
 

Комментарии:

1. Я предоставил дополнительную информацию с помощью скриншота. Надеюсь, это прояснит, чего я хочу.

2. теперь я понял, я изменю свой ответ

3. Решение сработало, спасибо. Можно ли использовать маршруты вместо списка виджетов?

4. да, но не маршруты, функции

Ответ №2:

 Navigator.push(context,MaterialpageRoute(builder:(context)=>ServiceDetailScreen(
                  service: services[index])));
 

Комментарии:

1. Добро пожаловать в Stack Overflow, и спасибо вам за ответ. Не могли бы вы, пожалуйста, отредактировать свой ответ, чтобы включить объяснение вашего кода? Это поможет будущим читателям лучше понять, что происходит, и особенно тем членам сообщества, которые новички в языке и изо всех сил пытаются понять концепции.