标签: flutter-navigation

在 Flutter 应用程序中通过向后滑动手势关闭键盘

当用户从边缘滑动到弹出路线时,我试图关闭键盘。

目前,键盘不会关闭,直到路线完全弹出,弄乱其他一些页面布局,直到它关闭

我确实尝试使用 aWillPopScope来确定用户何时要弹出路线,但不幸的是,这会禁用 iOS 或CupertinoPageRoute.

我只是想知道是否可以确定用户何时从边缘滑动到弹出或点击应用程序栏上的后退按钮并在执行此操作时关闭键盘。

如果可能的话,我会尝试在键盘开始滑动弹出时立即关闭键盘,就像许多应用程序中发生的那样。

我附上一个 gif 来显示我想要达到的效果。

滑动到弹出隐藏键盘

dart flutter flutter-navigation

6
推荐指数
1
解决办法
3478
查看次数

使用pop时如何在flutter中重新加载或调用某些函数initState()

当用户单击返回或我Navigator.pop()在第二个屏幕中使用时,我试图运行某种方法。

我有两个屏幕。

  1. 设定画面
  2. 编辑画面

编辑后,我将用户弹出到第一秒。现在在第一个屏幕中我使用SharedPreference. 但是当用户回到第一个屏幕时,我需要重新运行一个方法。我怎样才能做到这一点?

flutter flutter-navigation

6
推荐指数
1
解决办法
4505
查看次数

Android 中 Flutter 的“getApplicationContext()”替代方案是什么

我想创建一个通用的公共方法,如果有任何响应,则将应用程序导航到登录屏幕:unauthenticated

问题是我没有context在我的Navigator.

Android中我曾经使用:getApplicationContext(),我如何在Flutter中做到这一点?

android flutter flutter-navigation

6
推荐指数
1
解决办法
4704
查看次数

删除 Flutter 中导航的叠加

我用来Overlay.of(context)在单击按钮时显示一些内容。但有两个问题:

  • 导航到下一个屏幕时,覆盖层不会被删除。
  • 里面使用了下拉按钮。但菜单项显示在其下方。

这是“预期输出”。 预期输出

当前输出在此屏幕截图中。

电流输出

那么,如何在导航时删除覆盖层并正确显示下拉列表呢?如果无法使用覆盖,有什么解决方法吗?

PS:我用来NavigatorKey在单击固定侧栏中的名称时更改表格,如屏幕截图所示。

flutter flutter-navigation flutter-web

6
推荐指数
1
解决办法
4261
查看次数

颤动:如何在将导航器与页面一起使用时处理后退按钮按下

我正在尝试实现 Navigator 2.0 方法。我唯一无法工作的是按下后退按钮。当我按下后退按钮时,应用程序只是退出而不会转到上一页。我尝试了 WillPopPage 小部件,但后退按钮绕过了它。

这是一个不适用于背压的示例代码。

import 'package:flutter/material.dart';

main(List<String> args) {
  runApp(TestApp());
}

class TestApp extends StatefulWidget {
  @override
  _TestAppState createState() => _TestAppState();
}

class _TestAppState extends State<TestApp> {
  bool go = false;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Navigator(
        pages: [
          // page 1
          MaterialPage(
            child: W1(onTapped: () {
              setState(() => go = true);
            }),
          ),
          // page 2
          if (go) MaterialPage(child: W2()),
        ],
        onPopPage: (route, result) {
          if (!route.didPop(result)) return false;
          go = false;
          return …
Run Code Online (Sandbox Code Playgroud)

declarative dart flutter flutter-navigation

6
推荐指数
1
解决办法
2800
查看次数

处理图像/视频和导航器抖动的内存使用情况

抱歉提前发了这么大的帖子……

我的应用程序是一个与 Instagram 非常相似的社交网络。

图案

  1. 用户个人资料(包含缩略图列表,未播放视频)
  2. Navigator.push()选择照片(打开包含照片/播放视频的页面
  3. 选择另一个用户个人资料(例如在视频的评论中)
  4. 再次查看缩略图列表,然后发布照片 - 播放视频,等等......

这就像一个无限的“轮廓 - 进给”循环。按照这样的逻辑,在遇到错误之前,我使用 Navigator.push() 到达了大约 30 页OutOfMemory

Flutter 工具只是说lost connection to device,但我使用的越多Navigator,应用程序变得越迟缓,最终崩溃,所以我 99% 确定这是由于内存使用造成的。
这种情况 100% 发生,由于帖子列表中的滚动,或多或少会出现 1 页差异。

如果我不在图片/视频列表中滚动太多,则每个页面的内存使用量或多或少会增加 20MB。
我已经计划缩小我的图像,但这充其量只是推迟了问题的解决。

问题

  • OutOfMemory这种“无限页面”是否可能永远不会遇到异常?
  • 我知道有一个deactivate()方法StateFul Widgets可以在Navigator.push被调用后使用(dispose()没有被调用,因为我们没有从树中删除任何东西),也许应该在那里做一些工作?
  • 我应该做些什么来处理自己的Navigator堆栈吗?我不想打开pop()旧页面,因为我需要返回到第一个页面打开

在这种情况和这种逻辑下,这意味着如果我可能浏览 Instagram 中的 100 个页面,这也会以 100% 的速度崩溃。

我不确定是否有人会走那么远,也许这就是他们所指望的...如果没有办法阻止OutOfMemory,唯一的解决方案可能是延迟它,直到用户看到至少 100 个页面...

我在理论上找到了解决方法,但不确定这在代码中是否可能:

到目前为止我想到的唯一解决方案是允许用户访问push()一定数量的页面,并在Navigator堆栈中最多保留 20 …

dart flutter flutter-navigation

6
推荐指数
1
解决办法
3780
查看次数

Flutter - 在 PopupMenuButton onTap 中导航不起作用

我曾经使用 IconButton 的onpressed从我的 AppBar 导航到设置页面,这是有效的。现在我试图从 PopupMenuItem 的onTap触发导航,但页面不导航。两个小部件都位于同一层次结构中,我无法找出不同行为的原因。不会抛出任何错误。

这是我的 appBar 的代码,其中包含操作:

  Widget build(BuildContext ctx) {
    return Container(
      child: Scaffold(
        appBar: AppBar(
          title: const Text('MyApp'),
          actions: [
            PopupMenuButton(
              itemBuilder: (context) => [
// THE NAVIGATION IN onTap DOES NOT WORK
                PopupMenuItem(
                  child: Text(AppLocalizations.of(context).settings),
                  onTap: () => _openSettings(ctx),
                ),
              ],
              icon: Icon(
                Icons.settings,
              ),
            ),
// THIS WORKS
            IconButton(onPressed: () => _openSettings(ctx), 
                            icon: Icon(Icons.settings))
          ],
        ),
        body: Text("")  
      ),
    );
  }
Run Code Online (Sandbox Code Playgroud)

这里的导航调用只能在 IconButton 的onpressed内部工作。我可以确认该函数在这两种情况下都被触发:

  Future<void> _openSettings(BuildContext ctx) …
Run Code Online (Sandbox Code Playgroud)

dart flutter flutter-navigation

6
推荐指数
2
解决办法
4277
查看次数

颤动| 如何知道小部件是否位于导航堆栈顶部(可见)

在我的 Flutter 应用程序中,如果将新页面推送到导航堆栈,我希望暂停动画。

问题:从小部件的角度来看,有没有办法知道小部件是否位于导航堆栈的顶部?

例子:

while (isTopOfNavigationStack) {
    // Do the animation
}
Run Code Online (Sandbox Code Playgroud)

编辑1:更多细节

我使用库widget_marquee来创建水平滚动条。在将新页面推送到导航堆栈之前,该库一直运行良好。发生这种情况时,while-loop变得无限并且应用程序冻结。

library widget_marquee;

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

/// Rotates the [child] widget indefinitely along the horizontal axis if the
/// content extends pass the edge of the render area.
///
/// [delayDuration] - One time delay to wait before starting the text rotation
/// [gap] - Spacing to add between widget end and start
/// [loopDuration] - Time for one full …
Run Code Online (Sandbox Code Playgroud)

flutter flutter-animation flutter-navigation

6
推荐指数
1
解决办法
7871
查看次数

获取没有上下文的叠加层

我需要从OverlayState无法访问当前上下文的服务中引用当前内容。我尝试使用BuildContext从导航键获取我的“技巧”,但是虽然这适用于对话框和导航,但对于此用例似乎无效。我尝试过以下方法:

Overlay.of(navigatorKey.currentContext, rootOverlay: false);
Overlay.of(navigatorKey.currentState!.context, rootOverlay: false);
Overlay.of(navigatorKey.currentState!.overlay!.context, rootOverlay: false);
Run Code Online (Sandbox Code Playgroud)

并且全部返回 null。从小部件 () 调用的同一代码段Overlay.of(context)会返回一个有效的OverlayState. 有什么方法可以实现这一点吗?

flutter flutter-navigation

6
推荐指数
1
解决办法
1289
查看次数

使用 go_router 和 flutter_bloc 以及 Auth 和 UnAuth 流程进行反应式重定向

使用 flutter_bloc 和 go_router 实现基于身份验证更改的导航。

我需要做的是,如果用户经过身份验证,则应将其重定向到主屏幕,并能够导航身份验证流程...(HomeScreen,TestScreen1,TestScreen2)

如果用户在任何时候未经身份验证,则应将其重定向到登录屏幕,如果未知,则应重定向到启动屏幕。

我已经解决了许多 stackoverflow 问题和 github 问题,但没有一个提供我们如何实现这一目标的最佳实践。

问题:

  • 无法在身份验证流程中导航,HomeScreen -> Test1 || 主屏幕 -> 测试 2

提供以下资产:

Tried to listen to a value exposed with provider, from outside of the widget tree.

This is likely caused by an event handler (like a button's onPressed) that called
Provider.of without passing `listen: false`.

To fix, write:
Provider.of<$T>(context, listen: false);

It is unsupported because may pointlessly rebuild the widget associated to the
event handler, when the widget tree …
Run Code Online (Sandbox Code Playgroud)

flutter flutter-navigation flutter-bloc flutter-go-router

6
推荐指数
1
解决办法
3071
查看次数