【问题标题】:Full Url is not displayed in browser Flutter web浏览器 Flutter web 中不显示完整 URL
【发布时间】:2021-01-14 05:30:08
【问题描述】:

在我的应用程序中,我设置了一个自定义导航器,并且导航系统正常工作,浏览器不显示完整的 url,它总是显示 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: 回调调用),它使用开关返回具有应用过渡效果的相应小部件:

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(),
``

【问题讨论】:

    标签: navigation flutter-web


    【解决方案1】:

    调用 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
      ) 
    }
    ...
    

    【讨论】:

    • 您好,感谢您的回答。实际上,我更改了一点“main()”,因为传递了 buildernavigationKeyonGenerateRouteinitialRoute 导致始终在指定的初始路由上启动,从而使平台检查无效。我尝试在 initialRoute 上执行平台检查,但 Navigator 正在寻找名为“\”的不存在的路线。不幸的是,您建议的解决方案无法解决我的问题,不确定是否是针对我所做的更改..
    • 嗨尝试将您的 MaterialApp 构建器方法移动到 main() 并在您的 MainTemplate 中简单地传递孩子。它应该工作。更新的代码在上面。您可以根据您的更改更改 initialRoute
    • 嗨,再次感谢,不幸的是,它不起作用,将 initialRoute 声明为“/”我最终得到了一个双导航栏和一个白页,然后如果我单击一个导航栏按钮,那么它正常..一个导航栏,但浏览器中仍然没有完整的路线名称..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多