如何使用go_router使Flutter网页可滚动?

wwwo4jvm  于 2023-06-30  发布在  Flutter
关注(0)|答案(1)|浏览(148)

我用go_router包构建了一个网页。有一个ShellRoute可以使标题图像和标题导航栏对所有页面都是静态的。我不能使页面垂直滚动,但给出了渲染问题,无论我把SingleChildScrollView(同时删除扩展)。
下面是代码:

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';

void main() {
  runApp(MyApp());
}

final GoRouter _router = GoRouter(
  initialLocation: '/',
  routes: [
    ShellRoute(
      builder: (context, state, child) {
        return Scaffold(
          body: Padding(
            padding:EdgeInsets.symmetric(horizontal: 200),
            child: Column(
              children: [
                Image.asset('images/Banner.png'), //header image
                Container( //header menu
                  color: Colors.blue,
                  height: 100,
                ),
                Expanded(
                  child: child,
                ),
              ]
            ),
          ),
          );
      },
      routes: [
        GoRoute(
          path: "/",
          builder: (context, state) {
            return HomePage();
          },
        ),
      ],
    ),
  ],
);

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      routerConfig: _router,
      title: 'Test',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
    );
  }
}

class HomePage extends StatelessWidget {
  /// Constructs a [HomeScreen]
  HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    print('hit');
    return Scaffold(
      body: Column(
            children: [
              Container(height: 200, color: Colors.purple),
              Container(height: 300, color: Colors.green),
              Container(height: 400, color: Colors.red),
            ]
          )
        );
  }
}

另一个有趣的事情是,类HomePage在每次热重启时被触发3次。如果有像从API加载数据这样的网络活动,它将触发3次,使加载时间延长3倍。

utugiqy6

utugiqy61#

您只需将HomePage中的列 Package 为SingleChildScrollView,如下所示:

class HomePage extends StatelessWidget {
  /// Constructs a [HomeScreen]
  HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    print('hit');
    return Scaffold(
        body: SingleChildScrollView(
          child: Column(
              children: [
                Container(height: 200, color: Colors.purple),
                Container(height: 300, color: Colors.green),
                Container(height: 400, color: Colors.red),
              ]
          ),
        )
    );
  }
}

不应删除Expanded
关于重建。不知道为什么它发生了多次,但它不应该是一个问题。无论如何,你都不应该在构建方法中从API中获取数据。您应该始终以这样一种方式实现build方法,即多次调用该方法不会产生副作用。通常情况下,您有一个StatefulWidget,然后在initState中执行API调用,而不是在build

相关问题