我正在开发一个主要用于web的flutter应用程序,无法添加/获取查询参数,查询参数将包含一个id,该id应在应用中使用
这是我在应用程序上的路线设置状态:
return MaterialApp(navigatorKey: key, initialRoute: '/main',
routes: {
// When navigating to the "/" route, build the FirstScreen widget.
'/main': (context) => Map_View(),
// When navigating to the "/second" route, build the SecondScreen widget.
'/second': (context) => TaskClosed(),
},onGenerateRoute: RouteGenerator.generateRoute,);
}
class RouteGenerator{
static Route<dynamic> generateRoute(RouteSettings settings){
final args = settings.arguments;
print(args);
var routingData = settings.name;
}}
settings.arguments始终为空
那么我应该把什么传递给initialRoute,让它在第一个屏幕上接受参数例如,调用URL应该是这样的:
https://example.com/main?123
那么如何从URL 中获取此参数
我试过这个代码:
class RouteGenerator {
static Route<dynamic> generateRoute(RouteSettings settings) {
String? route;
Map? queryParameters;
if (settings.name != null) {
var uriData = Uri.parse(settings.name!);
route = uriData.path;
queryParameters = uriData.queryParameters;
}
var message =
'generateRoute: Route $route, QueryParameters $queryParameters';
print(message);
return MaterialPageRoute(
builder: (context) {
return MyHomePage(title: message);
},
settings: settings,
);
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Test App',
theme: ThemeData(
primarySwatch: Colors.blue,
),
initialRoute: '/main',
routes: {
// '/': (context) {
// print('route: /');
// return MyHomePage(title: 'Home');
// },
'/main': (context) {
print('route: /main');
return MyHomePage(title: 'route: Main');
},
'/second': (context) {
print('route: /second');
return MyHomePage(title: 'route: Second');
},
},
onGenerateRoute: RouteGenerator.generateRoute,
);
}
}
当我使用URLhttp://localhost:55260/#/main?123
运行应用程序时,我会得到以下输出:
generateRoute: Route /, QueryParameters {}
generateRoute: Route /main, QueryParameters {123: }
显示/main
的屏幕,并且正确显示URL。
对不起,我误解了这个场景。这是我的建议
删除routes
return MaterialApp(navigatorKey: key, initialRoute: '/main',
//routes: {
// When navigating to the "/" route, build the FirstScreen widget.
//'/main': (context) => Map_View(),
// When navigating to the "/second" route, build the SecondScreen widget.
//'/second': (context) => TaskClosed(),
// },
onGenerateRoute: RouteGenerator.generateRoute,);
}
和一样的变化
class RouteGenerator {
static Route<dynamic> generateRoute(RouteSettings settings) {
final args = settings.arguments;
print(args);
var routingData = settings.name;
switch (routingData) {
case "/main":
return MaterialPageRoute(
builder: (context) {
return Map_View();
},
settings: settings,
);
break;
case "/second":
return MaterialPageRoute(
builder: (context) {
return TaskClosed();
},
settings: settings,
);
break;
default:
return MaterialPageRoute(
builder: (context) {
return YouUnKnowPage();
},
settings: settings,
);
}
}
}
当您呼叫Navigator.of(context).pushNamed("/main",arguments:"123");
时它将移动到TaskClosed
并在控制台中打印123
此外,如果您直接键入类似https:example.com/main?123
的链接它将导致YouUnKnowPage
而不是Map_View
,并且参数将是null
。尝试使用Navigator.of(context).pushNamed("/main",arguments:"123");
如果你坚持直接键入链接,你可以试试这个
class RouteGenerator {
static Route<dynamic> generateRoute(RouteSettings settings) {
String routingData;
var arguments;
if (settings.name != null) {
routingData = settings.name;
}
final args = settings.arguments;
if (args != null) {
arguments = args;
} else {
Uri settingsUri = Uri.parse(settings.name);
if (settingsUri.hasQuery) {
arguments = "${settingsUri.queryParameters}";
}
if (settingsUri.pathSegments.length > 1) {
routingData =
"/" + settingsUri.pathSegments[settingsUri.pathSegments.length - 1];
}
}
if (arguments != null) {
print(arguments);
}
switch (routingData) {
case "/main":
return MaterialPageRoute(
builder: (context) {
return Map_View();
},
settings: settings,
);
break;
case "/second":
return MaterialPageRoute(
builder: (context) {
return TaskClosed();
},
settings: settings,
);
break;
default:
return MaterialPageRoute(
builder: (context) {
return YouUnKnowPage();
},
settings: settings,
);
}
}
}
现在它将移动到TaskClosed
并在控制台中打印{123:}