Android 为什么不是';t Navigator PushNamed和RemoveUntil未按预期工作?
Android 为什么不是';t Navigator PushNamed和RemoveUntil未按预期工作?,android,flutter,Android,Flutter,在我的应用程序中,我有一个带有墨水池的基本应用程序抽屉,用于处理手势(轻触) 我正在使用provider更改主题,但当我使用我的应用程序抽屉转到任何命名路由时,它会删除初始路由,即使我正在使用pushname和removeintil 但是,当我更改主题时,这会起作用。例如,当我进入设置\u screen.dart并使用开关将我的主题从浅色更改为深色时,会出现“后退”按钮,即我的初始路线。 这种奇怪行为的原因是什么? main.dart import 'package:flutter/materi
在我的应用程序中,我有一个带有墨水池的基本应用程序抽屉,用于处理手势(轻触) 我正在使用provider更改主题,但当我使用我的应用程序抽屉转到任何命名路由时,它会删除初始路由,即使我正在使用
pushname和removeintil
但是,当我更改主题时,这会起作用。例如,当我进入设置\u screen.dart并使用开关将我的主题从浅色更改为深色时,会出现“后退”按钮,即我的初始路线。
这种奇怪行为的原因是什么?main.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
//Providers
import './providers/themes.dart';
//screens
import './screens/home_screen.dart';
import './screens/about_screen.dart';
import './screens/news_screen.dart';
import './screens/department_screen.dart';
import './screens/admission_screen.dart';
import './screens/placements_screen.dart';
import './screens/contact_us_screen.dart';
import './screens/settings_screen.dart';
void main() => runApp(SfitApp());
class SfitApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<Themes>(
create: (_) => Themes(),
child: MaterialAppWithTheme(),
);
}
}
class MaterialAppWithTheme extends StatelessWidget {
@override
Widget build(BuildContext context) {
final theme = Provider.of<Themes>(context);
return MaterialApp(
title: "SFIT App",
//routes
initialRoute: '/',
routes: {
'/': (context) => HomeScreen(),
AboutScreen.routeName: (context) => AboutScreen(),
NewsScreen.routeName: (context) => NewsScreen(),
AdmissionScreen.routeName: (context) => AdmissionScreen(),
DepartmentScreen.routeName: (context) => DepartmentScreen(),
PlacementsScreen.routeName: (context) => PlacementsScreen(),
ContactUsScreen.routeName: (context) => ContactUsScreen(),
SettingsScreen.routeName: (context) => SettingsScreen(),
},
//theme
theme: theme.getTheme(),
);
}
}
设置屏幕
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
//providers
import '../providers/themes.dart';
class SettingsScreen extends StatefulWidget {
static const routeName = 'settings_screen';
@override
_SettingsScreenState createState() => _SettingsScreenState();
}
class _SettingsScreenState extends State<SettingsScreen> {
bool isSwitched = false;
@override
Widget build(BuildContext context) {
Themes themeChanger = Provider.of<Themes>(context);
return Scaffold(
appBar: AppBar(
title: Text(
'Settings',
style: Theme.of(context).textTheme.headline6,
),
brightness: Theme.of(context).brightness,
elevation: 3,
),
body: Container(
width: double.infinity,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Padding(
padding: EdgeInsets.fromLTRB(20, 10, 0, 10),
child:
Text("Theme", style: Theme.of(context).textTheme.headline5),
),
ListTile(
title: Text(
"Overall look and feel of the app",
style: Theme.of(context).textTheme.bodyText1,
),
subtitle: Text("Light/ Dark"),
trailing: Switch(
value: isSwitched,
onChanged: (value) {
if (value) {
themeChanger.changeTheme(Brightness.dark);
setState(() {
isSwitched = value;
});
print(value);
} else {
themeChanger.changeTheme(Brightness.light);
setState(() {
isSwitched = value;
});
print(value);
}
},
),
),
],
),
),
);
}
}
导入“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
//提供者
导入“../providers/themes.dart”;
类设置Screen扩展StatefulWidget{
静态常量routeName='设置\屏幕';
@凌驾
_SettingsScreenState createState()=>_SettingsScreenState();
}
类设置ScreenState扩展状态{
bool isSwitched=false;
@凌驾
小部件构建(构建上下文){
Themes themeChanger=Provider.of(上下文);
返回脚手架(
appBar:appBar(
标题:正文(
“设置”,
风格:Theme.of(context).textTheme.headline6,
),
亮度:主题(上下文)。亮度,
标高:3,
),
主体:容器(
宽度:double.infinity,
子:列(
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
填充物(
填充:从LTRB(20,10,0,10)开始的边缘设置,
儿童:
文本(“主题”,样式:Theme.of(context.textTheme.headline5),
),
列表砖(
标题:正文(
“应用程序的整体外观和感觉”,
样式:Theme.of(context).textTheme.bodyText1,
),
字幕:文本(“亮/暗”),
尾随:开关(
值:已切换,
一旦更改:(值){
如果(值){
改变主题(光明、黑暗);
设置状态(){
isSwitched=值;
});
印刷品(价值);
}否则{
改变主题(亮度、光线);
设置状态(){
isSwitched=值;
});
印刷品(价值);
}
},
),
),
],
),
),
);
}
}
其他文件尚未包括在内。
但是当我导航到它们中的任何一个时,应该出现在应用程序栏中的操作按钮就没有了。颤振中有一个bug。更新解决了问题颤振中有一个错误。更新解决了问题为什么您认为
pushname和removeintil
无法按预期工作?你认为“期望”是什么?用pushname和removeintil
发布最小代码,因为我认为没有人会尝试运行您的原始代码。我想说的是,初始路径正在弹出,即使它不应该弹出<代码>'/':(上下文)=>HomeScreen(),这是main.dart和Navigator.of(context).pushName和removeUntil(appSectionItem['onTap'],ModalRoute.withName('/'),)中的初始路由代码>这是我在抽屉里使用它的地方。请注意,appSectionItem['onTap']返回一个命名路由,即AboutScreen.RouteName。您的代码正在按预期工作。我试过使用你注释掉的ModalRoute
,但它仍然有效。我的代码一定有问题,因为当我按下一条路线时,它不会在应用程序栏中显示后退按钮,相反,当我返回时,它会关闭应用程序。因此,正如我所说:发布最小的不工作代码-没有人会尝试运行你的代码,很可能你的代码甚至没有编译。我已经为上面的源代码添加了zip文件,请尝试运行你为什么认为pushname和removeintil
不能按预期工作?你认为“期望”是什么?用pushname和removeintil
发布最小代码,因为我认为没有人会尝试运行您的原始代码。我想说的是,初始路径正在弹出,即使它不应该弹出<代码>'/':(上下文)=>HomeScreen(),
这是main.dart和Navigator.of(context).pushName和removeUntil(appSectionItem['onTap'],ModalRoute.withName('/'),)中的初始路由代码>这是我在抽屉里使用它的地方。请注意,appSectionItem['onTap']返回一个命名路由,即AboutScreen.RouteName。您的代码正在按预期工作。我试过使用你注释掉的ModalRoute
,但它仍然有效。我的代码一定有问题,因为当我按下一条路线时,它不会在应用程序栏中显示后退按钮,相反,当我返回时,它会关闭应用程序。因此,正如我所说:发布最小的不工作代码-没有人会尝试运行你的代码,很可能你的代码甚至没有编译。我已经为上面的源代码添加了zip文件,请尝试运行那个密码。
import 'package:flutter/material.dart';
class Themes with ChangeNotifier {
ThemeData _theme = ThemeData(
brightness: Brightness.light,
// primaryColor: Colors.yellow,
// accentColor: Colors.amber,
fontFamily: 'OpenSans',
textTheme: TextTheme(
headline5: TextStyle(
fontFamily: 'OpenSans',
fontSize: 16,
),
headline6: TextStyle(
fontFamily: 'OpenSans',
fontWeight: FontWeight.bold,
fontSize: 25,
),
bodyText1: TextStyle(
fontFamily: 'OpenSans',
fontSize: 14,
),
bodyText2: TextStyle(
fontFamily: 'OpenSans',
fontSize: 12,
),
headline4: TextStyle(
fontFamily: 'PlayfairDisplay',
fontSize: 25,
color: Colors.yellow[900],
),
),
);
getTheme() => _theme;
changeTheme(brightness) {
_theme = ThemeData(brightness: brightness);
notifyListeners();
}
}
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
//providers
import '../providers/themes.dart';
class SettingsScreen extends StatefulWidget {
static const routeName = 'settings_screen';
@override
_SettingsScreenState createState() => _SettingsScreenState();
}
class _SettingsScreenState extends State<SettingsScreen> {
bool isSwitched = false;
@override
Widget build(BuildContext context) {
Themes themeChanger = Provider.of<Themes>(context);
return Scaffold(
appBar: AppBar(
title: Text(
'Settings',
style: Theme.of(context).textTheme.headline6,
),
brightness: Theme.of(context).brightness,
elevation: 3,
),
body: Container(
width: double.infinity,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Padding(
padding: EdgeInsets.fromLTRB(20, 10, 0, 10),
child:
Text("Theme", style: Theme.of(context).textTheme.headline5),
),
ListTile(
title: Text(
"Overall look and feel of the app",
style: Theme.of(context).textTheme.bodyText1,
),
subtitle: Text("Light/ Dark"),
trailing: Switch(
value: isSwitched,
onChanged: (value) {
if (value) {
themeChanger.changeTheme(Brightness.dark);
setState(() {
isSwitched = value;
});
print(value);
} else {
themeChanger.changeTheme(Brightness.light);
setState(() {
isSwitched = value;
});
print(value);
}
},
),
),
],
),
),
);
}
}