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

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

附:导航器不工作:

【问题讨论】:

  • 您可以通过综合浏览量实现这一目标
  • 您能否再解释一下如何使用综合浏览量来实现这一目标?

标签: flutter 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(),
                  ]),
                )
              ],
            ),
          );
        }
      }
      
      

      【讨论】:

        猜你喜欢
        • 2020-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-19
        • 1970-01-01
        • 2016-12-23
        相关资源
        最近更新 更多