flutter - 每次我从任何页面返回时,Flutter 都会带我进入 MainPage(根页面(/))
问题描述
每次我从任何页面返回时,Flutter 都会带我进入 MainPage(根页面(/))
main.dart
这是我的应用程序主页
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'routes.dart' as router;
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
onGenerateRoute: router.generateRoute,
title: "Leuke App",
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
);
}
}
routes.dart
这是我的申请路线
import 'package:flutter/material.dart';
import 'package:leukeApp/pages/Login.dart';
import 'package:leukeApp/pages/MyProfile.dart';
import 'package:leukeApp/pages/SignUpDOB.dart';
import 'package:leukeApp/pages/SignUpOTP.dart';
import 'package:leukeApp/pages/SignUpSendOTP.dart';
import 'package:leukeApp/pages/SlidingUpPanelContainer.dart';
import 'package:leukeApp/pages/VideoRecorder.dart';
import 'package:leukeApp/pages/editProfile.dart';
import 'package:leukeApp/pages/MainPage.dart';
import 'package:leukeApp/pages/SignUpPage.dart';
Route<dynamic> generateRoute(RouteSettings settings) {
var arguments = settings.arguments;
switch (settings.name) {
case '/':
return MaterialPageRoute(builder: (context) => MainPage());
case 'login':
return MaterialPageRoute(builder: (context) => Login());
case 'sing-up':
return MaterialPageRoute(builder: (context) => SignUpPage());
case 'sign-up-dob':
return MaterialPageRoute(builder: (context) => SignUpDOB());
case 'login':
return MaterialPageRoute(builder: (context) => Login());
case 'sign-up-send-otp':
return MaterialPageRoute(builder: (context) => SignUpSendOTP(arguments));
case 'sign-up-otp':
return MaterialPageRoute(builder: (context) => SignUpOTP(arguments));
case 'home':
return MaterialPageRoute(builder: (context) => HomePage());
case 'camera':
return MaterialPageRoute(builder: (context) => VideoRecorder());
case 'edit-profile':
return MaterialPageRoute(builder: (context) => EditProfile());
case 'my-profile':
return MaterialPageRoute(builder: (context) => MyProfile());
default:
}
}
MainPage.dart
这是我的应用程序主页,显示闪屏并检查用户是否登录然后转到主页其他明智的登录页面导入'dart:async';
import 'package:connectivity/connectivity.dart';
import 'package:flutter/material.dart';
import 'package:leukeApp/services/SessionManager.dart';
class MainPage extends StatefulWidget {
@override
_MainPageState createState() => _MainPageState();
}
class _MainPageState extends State<MainPage> {
var loggedInUser = new Map();
final SessionManager sessions = new SessionManager();
@override
void initState() {
super.initState();
checkInternetConnection(true);
}
redirectToLoginOrHome() async {
await sessions.getUserInfo().then((checkLoggedInUservalue) {
loggedInUser = checkLoggedInUservalue;
if (loggedInUser['user_id'] > 0) {
setState(() {
Navigator.pushNamed(context, 'home');
});
} else {
setState(() {
Navigator.pushNamed(context, 'login');
});
}
});
}
Widget dialogContent(BuildContext context) {
return Container(
margin: EdgeInsets.only(left: 0.0, right: 0.0),
child: Stack(
children: <Widget>[
Container(
padding: EdgeInsets.only(
top: 18.0,
),
margin: EdgeInsets.only(top: 13.0, right: 8.0),
decoration: BoxDecoration(
color: Color(0xff2e2f34),
shape: BoxShape.rectangle,
borderRadius: BorderRadius.circular(16.0),
boxShadow: <BoxShadow>[
BoxShadow(
color: Colors.black26,
blurRadius: 0.0,
offset: Offset(0.0, 0.0),
),
]),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Center(
child: Container(
height: 80,
width: 80,
decoration: new BoxDecoration(
image: new DecorationImage(
image: new AssetImage("assets/images/no-internet.png"),
fit: BoxFit.cover,
),
),
) //
),
Center(
child: Padding(
padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
child: new Text("Internet Connection Error",
style: TextStyle(
fontSize: 20.0,
color: Color(0xfff5ae78),
fontWeight: FontWeight.bold)),
) //
),
Center(
child: Padding(
padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
child: new Text(
"Please check your internet connectivity and try again",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 15.0,
color: Colors.white,
)),
) //
),
Padding(
padding: const EdgeInsets.all(20.0),
child: RaisedButton(
padding: EdgeInsets.all(0),
child: Container(
height: 45,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Color(0xffec4a63), Color(0xff7350c7)],
begin: FractionalOffset(0.0, 1),
end: FractionalOffset(0.4, 4),
stops: [0.1, 0.7],
)),
child: Center(
child: Text(
'Retry',
style: TextStyle(
color: Colors.white,
fontSize: 20,
fontFamily: 'RockWellStd',
),
),
),
),
onPressed: () {
checkInternetConnection(false);
},
),
),
],
),
),
],
),
);
}
checkInternetConnection(bool showPopup) async {
var connectivityResult = await (Connectivity().checkConnectivity());
if (connectivityResult == ConnectivityResult.none) {
if (showPopup) {
showDialog(
context: context,
builder: (BuildContext context) => Dialog(
shape:
RoundedRectangleBorder(borderRadius: BorderRadius.circular(16.0)),
elevation: 0.0,
backgroundColor: Colors.transparent,
child: dialogContent(context),
),
);
}
} else {
Timer(Duration(milliseconds: 700), () => redirectToLoginOrHome());
}
}
@override
Widget build(BuildContext context) {
return Stack(children: <Widget>[
Container(
height: MediaQuery.of(context).size.height,
width: MediaQuery.of(context).size.width,
color: Color(0XFF15161a),
),
Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
child: Image.asset(
'assets/images/gif-logo.gif',
width: 200,
),
),
SizedBox(
height: 40,
),
Container(
child: Image.asset(
'assets/images/logo-name.gif',
width: 200,
),
)
],
),
)
]);
}
}
解决方案
这里的问题是 Navigator.pushNamed() 中使用的主页面的上下文从未改变。当前context
页面的
MaterialPageRoute(builder: (context) => MainPage());
将当前页面添加到路由堆栈。可以在文档中阅读更多详细信息。
推荐阅读
- sql-server - 如何在 SQL Server 中使用正则表达式
- java - 如何同时使用2个或多个jks证书文件?
- visual-studio-code - 在 VSCode 集成终端中,如何传递鼠标事件?
- javascript - 从本地存储卸载数据时的问题
- javascript - 填充猫鼬没有按预期工作
- vb.net - 将报表加载到 VB.net 中的 Datagrid 时出现内存不足异常
- javascript - 未捕获的 ReferenceError:regeneratorRuntime 未在 react 17、webpack 5 中定义,同时通过操作进行 api 调用
- visual-studio-code - VSCode`保存从`获取代码操作
- azure-data-factory - 使用 azure 数据工厂将头文件从 txt 文件复制到其他 csv 文件
- apache-flink - waterwark 对基于事件时间的间隔连接有什么影响