#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, и спасибо вам за ответ. Не могли бы вы, пожалуйста, отредактировать свой ответ, чтобы включить объяснение вашего кода? Это поможет будущим читателям лучше понять, что происходит, и особенно тем членам сообщества, которые новички в языке и изо всех сил пытаются понять концепции.