navigation - Flutter web 浏览器中不显示完整 URL

标签 navigation flutter-web

在我的应用程序中,我设置了一个自定义导航器,并使导航系统正常工作,浏览器不显示完整的网址,它始终显示 http://localhost:55865/#/ 。 。 你能发现我做错了什么吗?

我将所有路线声明为:

const String HomeRoute = '/home';
const String AboutRoute = '/about';
const String RetailerAccessRoute = '/retailers';
const String TermsOfServiceRoute = '/termsOfService';
const String PrivacyPolicyRoute = '/privacyPolicy';
const String PrivacySettingsRoute = '/privacySettings';
const String CommunityGuidelinesRoute = '/communityGuidelines';
const String LegalNoticeRoute = '/legalNotice';

然后我有 generateRoute (由 MaterialApponGenerateRoute: 回调调用),它使用开关返回相应的 Widget应用的过渡效果:

Route<dynamic> generateRoute(RouteSettings settings) {
//  print('generatedRoute: ${settings.name}');
  switch (settings.name) {
    case HomeRoute:
      return _getPageRoute((HomePage()));
    case AboutRoute:
      return _getPageRoute(AboutPage());
    case RetailerAccessRoute:
      return _getPageRoute(RetailerAccess());
    case TermsOfServiceRoute:
      return _getPageRoute(TermsOfService());
    case PrivacyPolicyRoute:
      return _getPageRoute(PrivacyPolicy());
    case CommunityGuidelinesRoute:
      return _getPageRoute(CommunityGuidelines());
    case LegalNoticeRoute:
      return _getPageRoute(LegalNotice());
  }
}

PageRoute _getPageRoute(Widget child) {
  return _FadeRoute(
    child: child,
  );
}

class _FadeRoute extends PageRouteBuilder {
  final Widget child;
  _FadeRoute({this.child})
      : super(
          pageBuilder: (
            BuildContext context,
            Animation<double> animation,
            Animation<double> secondaryAnimation,
          ) =>
              child,
          transitionsBuilder: (
            BuildContext context,
            Animation<double> animation,
            Animation<double> secondaryAnimation,
            Widget child,
          ) =>
              FadeTransition(
                opacity: animation,
                child: child,
          ),
        );
}

navigateTo() 方法实际上确实推送了路线:

class NavigationService {
  final GlobalKey<NavigatorState> navigatorKey = NavigatorKeys.webNavigatorGlobalKey;
//  final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
  
Future<dynamic> navigateTo(String routeName) {
    return navigatorKey.currentState.pushNamed(routeName);
  }
}

navigateTo()NavigationBar 的按钮(NavigationBarItem) onPressed: 回调中调用:

class NavigationBarItem extends StatelessWidget {
  final String title;
  final String navigationPath;
  const NavigationBarItem({this.title, this.navigationPath});

  @override
  Widget build(BuildContext context) {
    return RaisedButton(
      color: Colors.transparent,
      elevation: 0,
      hoverColor: Colors.transparent,
      hoverElevation: 0,
      highlightColor: Colors.transparent,
      highlightElevation: 0,
      splashColor: Colors.transparent,
      child:
      Text('$title',
        style: TextStyle(
            fontSize: 12,
            color: Colors.white,
            fontWeight: FontWeight.w400),
      ),
      onPressed: () {
        locator<NavigationService>().navigateTo(navigationPath);
      },
    );
  }
}

主页路线按钮示例:

 NavigationBarItem(
                title: AppLocalizations.instance.text('Home'),
                navigationPath: HomeRoute,
              ),

MainLayout 绘制由 NavigationBar 和传入的 Widget 组成的 Screen。

class MainLayout extends StatelessWidget {
  final Widget child;
  const MainLayout({Key key,this.child}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return ResponsiveBuilder(
      builder: (context, sizingInformation) => Scaffold(
        drawer: sizingInformation.deviceScreenType == DeviceScreenType.mobile
            ? NavigationDrawer()
            : null,
        backgroundColor: Colors.transparent,
        body: CenteredWidget(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              NavigationBar(),
              Expanded(
                child: Navigator(
                  key: locator<NavigationService>().navigatorKey,
                  onGenerateRoute: generateRoute,
                  initialRoute: CyclistsLandingRoute,
                ),
//              child:child,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

main() MaterialApp 中,如果平台是 Web,则返回 MainLayout;如果平台不是 Web,则返回实际应用程序:

        home: UniversalPlatform.isWeb
            ? MainLayout()
            : RetailerAccess(),
``

最佳答案

调用super时需要在设置中添加路由名称。更改后 _FadeRoute 如下所示:

class _FadeRoute extends PageRouteBuilder {
    final Widget child;
    String route;

    _FadeRoute({this.child, this.route})
      : super(
          pageBuilder: (
            BuildContext context,
            Animation<double> animation,
            Animation<double> secondaryAnimation,
          ) =>
              child,
          transitionsBuilder: (
            BuildContext context,
            Animation<double> animation,
            Animation<double> secondaryAnimation,
            Widget child,
          ) =>
              FadeTransition(
                opacity: animation,
                child: child,
          ),
          settings: RouteSettings(name: route)
        );
}

在主方法中

MaterialApp(
    ...
     builder: (context, child) {
            return MainTemplateLayout(
              child: child,
            );
      },
      navigatorKey: RouterNavigationService().navigatorKey,
      onGenerateRoute: generateRoute,
      initialRoute: "/",
...

和MainTemplateLayout中

build(BuildContext context){
...
  Container(
    child: child, // this is child passed to MainTemplate
  ) 
}
...

关于navigation - Flutter web 浏览器中不显示完整 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64105451/

相关文章:

html - 在标题中制作导航栏时遇到问题

Flutter web 上传文件取消事件

firebase - Flutter Web 和 Firebase 身份验证 : how to redirect not logged in user in flutter web?

Flutter for web,无法输入 TextField

javascript - 当用户点击浏览器后退按钮时触发事件

css - 如何删除仅出现在 Internet Explorer 导航菜单中的元素符号?

javascript - 是否可以使用 HTML5 或 jquery 中的坐标在网页中进行导航?

jquery - ASP.Net 中使用 JQuery 进行 DOM 导航

flutter 网页 : Show PDF or Any File from Assets on another browser tab or window

加载应用程序之前的 Flutter Web 应用程序进度指示器?