标签: flutter-navigation

异步等待 Navigator.push() - 出现 linter 警告:use_build_context_synchronously

在 Flutter 中,所有Navigator将新元素推送到导航堆栈的函数都会返回 a Future,因为调用者可以等待执行并处理结果。

我大量使用它,例如将用户(通过push())重定向到新页面时。当用户完成与该页面的交互时,我有时还希望原始页面pop()

onTap: () async {
  await Navigator.of(context).pushNamed(
    RoomAddPage.routeName,
    arguments: room,
  );

  Navigator.of(context).pop();
},
Run Code Online (Sandbox Code Playgroud)

一个常见的示例是使用带有敏感操作(例如删除实体)的按钮的底部工作表。当用户单击该按钮时,将打开另一个底部工作表,要求确认。当用户确认时,确认对话框以及打开确认底部表单的第一个底部表单将被关闭。

所以基本上onTap底部工作表内的“删除”按钮的属性如下所示:

onTap: () async {
  bool deleteConfirmed = await showModalBottomSheet<bool>(/* open the confirm dialog */);
  if (deleteConfirmed) {
    Navigator.of(context).pop();
  }
},
Run Code Online (Sandbox Code Playgroud)

这种方法一切都很好。我遇到的唯一问题是 linter 发出警告:use_build_context_synchronouslyBuildContext ,因为我在函数完成后使用相同的警告async

我忽略/暂停此警告是否安全?但是,我如何使用相同的后续代码等待导航堆栈上的推送操作BuildContext?有合适的替代方案吗?一定有可能做到这一点,对吧?

PS:我不能也不想检查该mounted属性,因为我没有使用StatefulWidget.

asynchronous lint dart flutter flutter-navigation

53
推荐指数
2
解决办法
2万
查看次数

在Flutter中的屏幕之间传递数据

当我正在学习Flutter时,我来到导航.我想屏幕之间的数据传递类似于Android中传递活动之间的数据iOS中查看控制器之间传递数据.我如何在Flutter中做到这一点?

相关问题:

我正在创建这个规范问答,因为我找不到Flutter的另一个.我的答案如下.

dart flutter flutter-navigation

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

导航时如何在颤动中修复黑屏?

我正在创建一个关于颤振的多页应用程序。当我在其中使用导航时,出现黑屏。

    导入 'package:flutter/material.dart';
    
    
    void main() => runApp(MyHomePage());
    
    class MyHomePage 扩展 StatelessWidget {
      @覆盖
      小部件构建(BuildContext 上下文){
        返回 MaterialApp(
          主页: Page0(),
        );
      }
    }
    
    类 Page0 扩展了 StatefulWidget {
      @覆盖
      _Page0State createState() => _Page0State();
    }
    
    类 _Page0State 扩展状态 {
      @覆盖
      小部件构建(BuildContext 上下文){
        返回脚手架(
          背景颜色:颜色(0xFF493597),
          正文:列表视图(
            孩子们: [
              填充(
                填充:EdgeInsets.only(顶部:15.0,左侧:10.0),
              ),
              大小盒(
                高度:25.0,
              ),
              填充(
                填充:EdgeInsets.only(左:40.0),
                孩子:行(
                  孩子们: [
                    文本(
                      '费用',
                      样式:文本样式(
                          fontFamily: '蒙特塞拉特',
                          颜色:Colors.white,
                          fontWeight: FontWeight.bold,
                          字体大小:25.0),
                    ),
                    大小盒(
                      宽度:10.0,
                    ),
                    文本(
                      '什么',
                      样式:文本样式(
                        fontFamily: '蒙特塞拉特',
                        颜色:Colors.white,
                        字体大小:25.0,
                      ),
                    ),
                  ],
                ), …

navigation scaffold dart flutter flutter-navigation

17
推荐指数
5
解决办法
2463
查看次数

如何在 Flutter 中进行嵌套导航

有人对在 Flutter 中找出嵌套导航有什么建议吗?

我想要的是即使在重定向到新屏幕时也能保持一个持久的 BottomNavigationBar。与 YouTube 类似,即使您更深入地浏览菜单,底部栏也始终存在。

我无法从文档中弄清楚。

到目前为止,我能找到的唯一一个深入了解我的要求的教程是https://medium.com/coding-with-flutter/flutter-case-study-multiple-navigators-with-bottomnavigationbar-90eb6caa6dbf (源代码)。然而,它超级混乱。

现在我正在使用

Navigator.push(context,
                MaterialPageRoute(builder: (BuildContext context) {
              return Container()
Run Code Online (Sandbox Code Playgroud)

然而,它只是将新的小部件推送到整个堆栈上,围绕着底部导航栏。

任何提示将非常感谢!

flutter flutter-navigation

14
推荐指数
2
解决办法
1万
查看次数

Flutter 导航,重新打开页面而不是再次推送

我是 flutter 的新手,我正在开发一个具有多个屏幕的应用程序。

我想知道如何阻止 Flutter 创建同一路线的多个屏幕,例如我有Page 1Page 2,如果我单击按钮导航到 Page 2 并再次单击同一个按钮,应用程序将推送一个第 2 页的新屏幕,我将拥有两次,如果我单击返回按钮,它会将我送回第一个创建的第 2 页

有没有办法只创建每个页面一次然后重新打开它,如果它已经被推送到堆栈中?

我正在使用Navigator.push所有导航

mobile-application flutter flutter-navigation

11
推荐指数
3
解决办法
1万
查看次数

如何在多个小部件上确定提供程序的范围,而不将提供程序放在颤振中的根小部件上

我正在开发一个简单的演示,用户登录,查看项目列表,单击项目,然后查看其详细信息。这是 3 个屏幕,但我们假设有两个流程,其中一个处理登录,另一个处理项目。

我正在使用包管理我的状态provider。我LoginRepository在我的根小部件上放置了一个提供程序,因为到处都需要该状态。这很好用。

现在我需要一个ItemRepository应该在ItemListScreen和 上可用的ItemDetailScreen。为了实现该范围,我决定创建一个名为 的共同祖先小部件ItemScreens。这是我放置提供程序和嵌套 Navigator.

我使用导航器来导航屏幕,Navigator.of(context)以确保使用了关闭的祖先导航器。我使用获取我的提供程序Provider.of<ItemRepository>(context)来确保使用关闭祖先状态。

这显然不起作用,因为我得到了Could not find the correct provider. 我知道来自同级路由的提供程序不能被另一个同级路由访问,但在这里我嵌套导航器,我希望将其ItemRepository放置在ItemScreens其中然后处理子路由,以便这两个路由可以从父路由获取提供程序?

旁注:
Flutter文档明确指出应提升提供程序以实现正确的范围界定。但我从未见过将提供程序提升为非根小部件的示例。如果我们所能做的就是将提供程序放入根小部件中,那么应该明确说明这一点。

编辑:在多个小部件上重新创建提供程序是一种替代方案,但这并不是真正的范围,它只是伪值传递。

编辑:将所有提供程序放在根小部件上MultiProvider并不是一个好主意,因为它创建了全局状态反模式。除非需要,即用户正在访问该流程/屏幕,否则不应创建某些状态。

flutter flutter-navigation flutter-provider

11
推荐指数
1
解决办法
1562
查看次数

如何将 flutter_bloc 与 go_router 一起使用

我构建了一个使用 flutter_bloc 的应用程序。我想使用 go_router 进行导航。但是对于动态路由,我如何将 GoRouter refreshListener 参数与 flutter_bloc 一起使用

GoRouter(
  routes: [
    GoRoute(
      path: '/',
      name: 'home',
      pageBuilder: (context, state) => HomePage.page(),
    ),
    GoRoute(
      path: '/login',
      name: 'login',
      pageBuilder: (context, state) => LoginPage.page(),
    ),
  ],
  redirect: (state) {
    final isLoggedIn =
        bloc.state.status == AuthenticationStatus.authenticated;
    final isLoggingIn = state.location == '/login';

    if (!isLoggingIn && !isLoggingIn) return '/login';
    if (isLoggedIn && isLoggingIn) return "/";

    return null;
  },
  refreshListenable: 
   );
Run Code Online (Sandbox Code Playgroud)

flutter flutter-navigation flutter-bloc

10
推荐指数
3
解决办法
2万
查看次数

在Flutter的嵌套导航器结构中,如何获得特定的导航器?

当我有Nested时,我遇到了这个问题Navigator。所以像

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      initialRoute: "/",
      routes: {
        '/': (context) => SomeOneView(),
        '/two': (context) => SomeTwoView(),
        '/three': (context) => SomeThreeView(),
      },
    );
  }
}

class SomeOneView extends StatefulWidget {
  @override
  _SomeOneViewState createState() => _SomeOneViewState();
}

class _SomeOneViewState extends State<SomeOneView> {
  @override
  Widget build(BuildContext context) {
   return Container(
      width: double.infinity,
      height: double.infinity,
      color: Colors.indigo,
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          MaterialButton(
            color: …
Run Code Online (Sandbox Code Playgroud)

flutter flutter-navigation

9
推荐指数
2
解决办法
1456
查看次数

如何删除默认导航路线动画

我在颤振文档中给出的页面路由代码下面

// Within the `FirstRoute` widget
onPressed: () {
  Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => SecondRoute()),
  );
}
Run Code Online (Sandbox Code Playgroud)

但是它在推送和弹出路由时提供了一些动画。

对于Android,页面的入口过渡将页面向上滑动并淡入。出口过渡相同,但相反。

过渡适应平台,在iOS上,页面从右侧滑入反向退出。当另一个页面进入以覆盖它时,页面也会以视差向左移动。(这些方向在具有从右到左阅读方向的环境中翻转。)

有没有办法在没有任何动画的情况下路由到下一页?

编辑: 请检查整个代码:

class MyApp extends StatelessWidget {
  final routes = <String, WidgetBuilder>{
    SecondRoute.tag: (context) => SecondRoute(),
  };

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Flutter Routes",
      home: new FirstRoute(),
      routes: routes,
      onGenerateRoute: (routeSettings) {
        if (routeSettings.name == SecondRoute.tag)
          return PageRouteBuilder(pageBuilder: (_, a1, a2) => SecondRoute());

        return null;
      },
    );
  }
}

class FirstRoute extends StatelessWidget {
  @override
  Widget …
Run Code Online (Sandbox Code Playgroud)

flutter flutter-animation flutter-navigation

9
推荐指数
2
解决办法
7629
查看次数

底部导航栏的 TabBarView 或 IndexedStack - Flutter

在颤动中做底部导航栏的最佳方法是什么?

根据获取到导航的颤振底部扑团队使用IndexedStackOffstage显示当用户更改标签的部件,但是我看到有做这个的另一种方式TabBarView,以简单的幻灯片动画控件之间的变化,也保持每个插件的滚动状态

那么IndexedStack+Offstage和之间有什么区别TabBarView?我应该使用类似的东西flutter_bloc还是只使用setState()?

flutter flutter-navigation

9
推荐指数
1
解决办法
2363
查看次数