flutter - 如何使用导航器将小部件推送到屏幕的一部分?

标签 flutter routes widget push navigator

我将设备屏幕分为两部分,顶 View 和底 View 。我想通过执行以下操作从 BottomView 中使用导航器推送新 View :Navigator.of(context).pushNamed('/nameHere')。但是,我需要将新 View 推送到仅代替底部 View ,而不是整个屏幕,因为它发生了。

这是我的 main.dart:

void main() {
  runApp(
    MaterialApp(
      darkTheme: ThemeData(),
      initialRoute: homeRoute,
      routes: {
        homeRoute: (context) => const HomeView(),
        newViewRoute: (context) => const NewView(),
      },
    ),
  );
}

我的主页 View :

class HomeView extends StatelessWidget {
  const HomeView({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        bottom: false,
        child: Column(
          children: [
            const Expanded(
              child TopView(),
            ),
            const Expanded(
              child: BottomView(),
            )
          ],
        ),
      ),
    );
  }
}

和我的 BottomView,我在其中推送新 View ,我希望它仅出现在屏幕的底部:

class BottomView extends StatelessWidget {
  const BottomView({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ElevatedButton(
        onPressed: () {
          Navigator.of(context)
          .pushNamed(newViewRoute);
        }
      )
    );
  }
}

感谢大家的帮助!

最佳答案

解决方案

此解决方案不需要任何外部库

如果您需要修复顶部小部件并仅替换底部屏幕的导航,您可以创建一个包裹整个小部件的基础小部件,并且该基础小部件不会受到 flutter 导航器的影响。

示例

创建一个像这样的基本 View

class BaseView extends StatelessWidget {
  const BaseView({super.key, required this.child});
  final Widget child;
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        TopView(), // the top view that does not change
        child, // child widget that changes
      ],
    );
  }
}

您的 main.dart 应在构建器中包含 BaseView ,如下所示

void main() {
  runApp(
    MaterialApp(
      darkTheme: ThemeData(),
      initialRoute: homeRoute,
      builder: (context, child) => BaseView(child: child!),
      routes: {
        homeRoute: (context) => const BottomRoute1(),
        newViewRoute: (context) => const BottomRoute2(),
      },
    ),
  );
}

使用此解决方案,您创建的所有路线都将呈现在屏幕底部,并使用默认的 flutter 导航更改底部小部件。这可用于为移动应用程序或 flutter 网站创建固定的顶部或底部导航。

希望这能解决您的问题。

异常

如果您在使用命名路由导航时遇到这样的错误 error while navigating

main.dart中添加导航键

GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();

void main() {
  runApp(
    MaterialApp(
      darkTheme: ThemeData(),
      navigatorKey: navigatorKey, // add navigator key to material app
      initialRoute: homeRoute,
      builder: (context, child) => BaseView(child: child!),
      routes: {
        homeRoute: (context) => const BottomRoute1(),
        newViewRoute: (context) => const BottomRoute2(),
      },
    ),
  );
}

您现在可以在应用中使用此导航器进行导航,如下所示

navigatorKey.currentState!.pushNamed(routeName);

这应该可以解决您遇到的任何问题。 您可以查看我使用此方法构建的项目 here

编码愉快😀👍

关于flutter - 如何使用导航器将小部件推送到屏幕的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74634641/

相关文章:

laravel - 在 Laravel 中创建资源路由,无需特定方法

ruby-on-rails - Rails 3 路由并使用 GET 创建干净的 URL?

Android Widget Upgrade app..删除小部件

qt - 隐藏的QWidget对象接收信号

list - 无法使用列表创建ListView.builder

json - 如何将复杂(嵌套)对象解析为 JSON 并在 flutter 中使用 HTTP 将其发送到服务器?

dart - 右对齐而不调整父级大小

ios - ML 套件人脸识别不适用于 IOS

angularjs - 使用 ui-sref 进行站点导航,如何在不可用时删除 ui-sref 属性

android - 小部件 - 接收时 Intent 保持不变