是否可以在 Flutter Web 的同一页面中创建指向部分的链接?

Posted

技术标签:

【中文标题】是否可以在 Flutter Web 的同一页面中创建指向部分的链接?【英文标题】:Is it possible to create links to sections in the same page in flutter web? 【发布时间】:2020-07-01 15:52:54 【问题描述】:

我想使用 Flutter Web 创建一个网站,但我无法导航到同一页面中的部分。这是我想使用颤振实现的一个示例。

附:导航器不工作:

【问题讨论】:

您可以通过综合浏览量实现这一目标 您能否再解释一下如何使用综合浏览量来实现这一目标? 【参考方案1】:

我用 PageView

创建了一个示例
class MyHomePage extends StatelessWidget 

  var list = ["Home","Services", "Work", "About"];
  var colors = [Colors.orange, Colors.blue, Colors.red, Colors.green];

  PageController controller = PageController();

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: SafeArea(
        child: Column(
          mainAxisSize: MainAxisSize.max,
          children: <Widget>[
            Row(
              children: <Widget>[
                Container(
                  width: 50,
                  height: 50,
                  margin: EdgeInsets.all(8),
                  decoration: BoxDecoration(
                    color: Colors.blue,
                    borderRadius: BorderRadius.circular(10)
                  ),
                ),
                Spacer(),
                Row(
                  children: List.generate(3, (index)
                    return GestureDetector(
                      onTap: ()
                        _scrollToIndex(index);
                      ,
                      child: Container(
                        margin: EdgeInsets.all(8),
                        child: Text(
                          list[index+1]
                        ),
                      ),
                    );
                  ),
                )
              ],
            ),
            Expanded(
              child : PageView(
                scrollDirection: Axis.vertical,
                pageSnapping: false,
                controller: controller,
                children: List.generate(list.length, (index)
                  return Container(
                    width: MediaQuery.of(context).size.width,
                    height: double.maxFinite,
                    color: colors[index],
                    child: Center(
                      child: Text(
                          list[index],
                          style: TextStyle(
                            color: Colors.white,
                            fontSize: 50
                          ),
                      ),
                    ),
                  );
                )
              ),
            ),
          ],
        )
      ),
    );
  

  void _scrollToIndex(int index) 
    controller.animateToPage(index + 1, duration: Duration(seconds: 2), curve: Curves.fastLinearToSlowEaseIn);
  

输出:

【讨论】:

【参考方案2】:

ScrollController 就是你要找的东西。

向您的 ScrollView 添加一个新的,您可以设置您希望它滚动到的位置。

【讨论】:

【参考方案3】:

Josteve 提到了一种方法。但我想展示另一种方式,它提供更多功能,正如您在 gif 示例中所期望的那样。

您可以在此处查看演示:https://mohith7548.github.io/portfolio/

我的项目有 3 个部分,分别称为 About、Blog 和 Projects。它还有另一个称为 Home 的顶部部分。所以屏幕的顺序是主页、关于、博客和项目。每个部分都采用全屏高度和宽度。所以这些页面的起始偏移量分别是[0 * screenHeight, 1 * screenHeight, 2 * screenHeight, 3 * screenHeight]screenHeight 可以通过 MediaQuery.of(context).size.heightbuild 方法中访问。

class Portfolio extends StatefulWidget 
  @override
  _Portfoliostate createState() => _PortfolioState();


class _PortfolioState extends State<Portfolio> 
  ScrollController _scrollController;
  String _curNavItem;

  static double offsetHome = 0;
  static double offsetAbout = SizeConfig.screenHeight;
  static double offsetBlog = 2 * SizeConfig.screenHeight;
  static double offsetProjects = 3 * SizeConfig.screenHeight;

  @override
  void initState() 
    super.initState();
    _scrollController = ScrollController();
  

  @override
  void dispose() 
    super.dispose();
    _scrollController.dispose();
  

  void scrollTo(String title) 
    double offset = 0;
    switch (title) 
      case Constants.HOME:
        offset = offsetHome;
        break;
      case Constants.ABOUT:
        offset = offsetAbout;
        break;
      case Constants.BLOG:
        offset = offsetBlog;
        break;
      case Constants.PROJECTS:
        offset = offsetProjects;
        break;
    

    setState(() 
      _curNavItem = title;
    );

    // animate to the pag
    _scrollController.animateTo(
      offset,
      duration: Duration(milliseconds: 500),
      curve: Curves.easeInOutQuart,
    );
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: CustomScrollView(
        physics: PageScrollPhysics(), // use NeverScrollableScrollPhysics() to block user scrolling
        controller: _scrollController,
        slivers: <Widget>[
          // This is just SliverAppBar wrapped in InterheritedWidget called NavState
          // You can use just SliverAppBar
          NavState(
            curNavItem: _curNavItem,
            scrollTo: scrollTo,
            child: AppBanner(key: _appBannerKey), // SliverAppBar in another file
          ),
          SliverList(
            delegate: SliverChildListDelegate([
              About(),
              Blog(),
              Projects(),
            ]),
          )
        ],
      ),
    );
  


【讨论】:

以上是关于是否可以在 Flutter Web 的同一页面中创建指向部分的链接?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在使用 Jira 凭据的 asp.net mvc 应用程序中创建登录页面?

在 Flutter Web 中接受付款

无法在flutter web的有限高度容器中创建滚动

Flutter - html页面内带有href链接的WebView错误

在 Flutter Web 中嵌入 Youtube 视频

如何在 Flutter Web 中创建 DOM 元素并使用 ID 声明它