#flutter #navigation
Вопрос:
Я могу перенести все аргументы на страницы, которые я изложил. Проблема в том, что идентификатор продукта не передается по URL-адресу в сети flutter. Когда я нажимаю кнопку в классе Избранное, URL-адрес становится http://localhost:5000/#/prod вместо http://localhost:5000/#/prod/rebEZ0Wswa5UXKfkKjSV (Последняя часть URL-адреса-ProductID)
const String HomeRoute = '/';
const String FavoritesRoute = '/favs';
const String ProductDetailRoute = '/prod';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
initialRoute: HomeRoute,
routes: {
HomeRoute: (context) => HomePage(),
FavoritesRoute: (context) => Favorites(),
ProductDetailRoute: (context) =>
ProductDetails(ModalRoute.of(context).settings.arguments),
},
);
}
}
class ProductDetails extends StatefulWidget {
final productDetailsName;
final productDetailsImage;
final productDetailsoldPrice;
var productDetailsPrice;
final productDetailsDesc;
final productDetailsQty;
final productId;
final productTime;
var productDetailsWinner;
ProductDetails(this.productId,
{this.productDetailsName,
this.productDetailsImage,
this.productDetailsoldPrice,
this.productDetailsPrice,
this.productDetailsDesc,
this.productDetailsQty,
this.productTime,
this.productDetailsWinner, arguments});
class Favorites extends StatefulWidget {
...
...
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(),
floatingActionButton: FloatingActionButton(
onPressed: () {
Navigator.pushNamed(context,ProductDetailRoute,
arguments: ProductDetails(
snapshot.data[index]["productId"],
productDetailsName: snapshot.data[index]["name"],
productDetailsImage: snapshot.data[index]["image"],
productDetailsoldPrice: snapshot.data[index]["oldPrice"],
productDetailsPrice: snapshot.data[index]["price"],
productDetailsDesc: snapshot.data[index]["prodDesc"],
),
),
},
),
);
}
}
Комментарии:
1. Я предлагаю использовать пакет fluro
Ответ №1:
Метод Navigator.pushNamed принимает 2 обязательных аргумента (контекст BuildContext, имя маршрута строки) и один необязательный аргумент (объект? аргумент), в вашем коде выше:
Navigator.pushNamed(context,ProductDetailRoute,
arguments: ProductDetails(
snapshot.data[index]["productId"],
productDetailsName: snapshot.data[index]["name"],
productDetailsImage: snapshot.data[index]["image"],
productDetailsoldPrice: snapshot.data[index]["oldPrice"],
productDetailsPrice: snapshot.data[index]["price"],
productDetailsDesc: snapshot.data[index]["prodDesc"],
),
),
},
имя маршрута будет храниться в этой переменной ProductDetailRoute, попробуйте сделать ее функцией, которая принимает идентификатор продукта и возвращает его следующим образом:
String _getProductDetailRouteName(String id){
return '/prod/$id';
}
и назначить его
Navigator.pushNamed(context,_getProductDetailRouteName(id),
arguments: ProductDetails(
snapshot.data[index]["productId"],
productDetailsName: snapshot.data[index]["name"],
productDetailsImage: snapshot.data[index]["image"],
productDetailsoldPrice: snapshot.data[index]["oldPrice"],
productDetailsPrice: snapshot.data[index]["price"],
productDetailsDesc: snapshot.data[index]["prodDesc"],
),
),
},
Комментарии:
1. Где именно мне нужно определить имя _getProductDetailRouteName ? Когда я определяю его в классе «Избранное», я получил ошибку» Было выдано другое исключение: не удалось найти генератор для определения маршрутов («/prod/Ceket», ProductDetails) в _WidgetsAppState.
2. Вы используете onGenerateRoute в MaterialApp для определения маршрутов?
3. Нет, я им не пользовался. Я просто использовал то, что дал выше
4. Это довольно сложно, так как метод, который вы используете выше, принимает только предопределенную строку для имени маршрута, попробуйте использовать Navigator 2.0, он хорошо подходит для этого случая.