在 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.
当我正在学习Flutter时,我来到导航.我想屏幕之间的数据传递类似于Android中传递活动之间的数据和iOS中查看控制器之间传递数据.我如何在Flutter中做到这一点?
相关问题:
我正在创建这个规范问答,因为我找不到Flutter的另一个.我的答案如下.
我正在创建一个关于颤振的多页应用程序。当我在其中使用导航时,出现黑屏。
导入 '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,
),
),
],
), … 有人对在 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 创建同一路线的多个屏幕,例如我有Page 1和Page 2,如果我单击按钮导航到 Page 2 并再次单击同一个按钮,应用程序将推送一个第 2 页的新屏幕,我将拥有两次,如果我单击返回按钮,它会将我送回第一个创建的第 2 页
有没有办法只创建每个页面一次然后重新打开它,如果它已经被推送到堆栈中?
我正在使用Navigator.push所有导航
我正在开发一个简单的演示,用户登录,查看项目列表,单击项目,然后查看其详细信息。这是 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_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) 当我有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) 我在颤振文档中给出的页面路由代码下面
// 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) 在颤动中做底部导航栏的最佳方法是什么?
根据获取到导航的颤振底部扑团队使用IndexedStack与Offstage显示当用户更改标签的部件,但是我看到有做这个的另一种方式TabBarView,以简单的幻灯片动画控件之间的变化,也保持每个插件的滚动状态
那么IndexedStack+Offstage和之间有什么区别TabBarView?我应该使用类似的东西flutter_bloc还是只使用setState()?