我注意到的是,当我弹出预览屏幕时,URL中的查询参数仍然没有删除。
以下是URL在Web上的外观:
**预期结果:**在浏览器的地址栏中,它应该:#/
**实际效果:**浏览器地址栏显示:#/?sort=asc
使用:go_route:联系我们
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:go_router/go_router.dart';
final Map<String, dynamic> _families = {
"f1": {
"name": "Doe",
"people": {
"p1": {"name": "Jane", "age": 23},
"p2": {"name": "John", "age": 6}
}
},
"f2": {
"name": "Wong",
"people": {
"p1": {"name": "June", "age": 51},
"p2": {"name": "Xin", "age": 44}
}
}
};
void main() => runApp(App());
/// The main app.
class App extends StatelessWidget {
/// Creates an [App].
App({Key? key}) : super(key: key);
/// The title of the app.
static const String title = 'GoRouter Example: Query Parameters';
// add the login info into the tree as app state that can change over time
@override
Widget build(BuildContext context) => MaterialApp.router(
routerConfig: _router,
title: title,
debugShowCheckedModeBanner: false,
);
late final GoRouter _router = GoRouter(
initialLocation: '/',
redirect: (context, state) {
print('Subloc: ${state.subloc}');
},
debugLogDiagnostics: true,
routerNeglect: true,
routes: <GoRoute>[
GoRoute(
path: '/',
builder: (BuildContext context, GoRouterState state) {
return const HomeScreen();
},
routes: <GoRoute>[
GoRoute(
name: 'family',
path: 'family/:fid',
builder: (BuildContext context, GoRouterState state) {
return FamilyScreen(
fid: state.params['fid']!,
asc: state.queryParams['sort'] == 'asc',
);
}),
],
),
],
);
}
/// The home screen that shows a list of families.
class HomeScreen extends StatelessWidget {
/// Creates a [HomeScreen].
const HomeScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: const Text(App.title),
),
body: ListView(
children: <Widget>[
for (final String fid in _families.keys)
ListTile(
title: Text(_families[fid]['name']),
onTap: () {
context.goNamed(
'family',
params: {'fid': fid},
queryParams: {'sort': 'asc'},
);
},
)
],
),
);
}
}
/// The screen that shows a list of persons in a family.
class FamilyScreen extends StatelessWidget {
/// Creates a [FamilyScreen].
const FamilyScreen({required this.fid, required this.asc, Key? key})
: super(key: key);
/// The family to display.
final String fid;
/// Whether to sort the name in ascending order.
final bool asc;
@override
Widget build(BuildContext context) {
final Map<String, String> newQueries;
final List<String> names = _families[fid]['people']
.values
.map<String>((dynamic p) => p['name'] as String)
.toList();
names.sort();
if (asc) {
newQueries = const <String, String>{'sort': 'desc'};
} else {
newQueries = const <String, String>{'sort': 'asc'};
}
return Scaffold(
appBar: AppBar(
title: Text(_families[fid]['name']),
leading: BackButton(
onPressed: () {
GoRouter.of(context).pop();
},
),
actions: <Widget>[
IconButton(
onPressed: () {
context.goNamed('family',
params: <String, String>{'fid': fid},
queryParams: newQueries);
},
tooltip: 'sort ascending or descending',
icon: const Icon(Icons.sort),
)
],
),
body: ListView(
children: <Widget>[
for (final String name in asc ? names : names.reversed)
ListTile(
title: Text(name),
),
],
),
);
}
}
1条答案
按热度按时间ncecgwcz1#
根据一位Go Router维护者的评论,它正在按预期工作。下面是删除了不必要的示例代码的注解:
这是WAI,这是我使用的代码:
[已删除]
查询参数应该持久化,因为整个路由栈都是用查询参数构建的。如果要清除查询参数,可以在不使用查询参数的情况下使用context.后藤()
因此,解决方法是调用
context.go()
(以前是context.goto()
)返回到上一页,而不使用路径参数。不幸的是,这需要你显式地提到页面,我不知道这是如何打算工作时,前一页也有自己的查询参数,应保持。