如何在 Flutter 上使用导航器
How to use navigator on flutter
我有这样的页面结构:
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'First App',
theme: ThemeData(
primaryColor: appPrimaryColour,
scaffoldBackgroundColor: appBackGroupCoulour,
),
home: const WelcomePage(),
);
class WelcomePage extends StatelessWidget {
const WelcomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const Scaffold(
body: Body(),
);
}
}
欢迎页正文:
//Body for the welcome page
class Body extends StatelessWidget {
const Body({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return Background(
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
"Welcome To My First App",
style: TextStyle(fontWeight: FontWeight.bold),
),
SizedBox(height: size.height * 0.05),
SizedBox(height: size.height * 0.05),
RoundedButton(
text: "LOGIN",
color: appPrimaryColour,
onPressed: () => {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => const LoginPage(),
),
),
},
),
],
),
),
);
}
}
登录页面传递登录页面的body widget
class LoginPage extends StatelessWidget {
const LoginPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const Scaffold(
body: Body(),
);
}
}
登录正文:
//Body for login
class Body extends StatelessWidget {
const Body({
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return Background(
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
"LOGIN",
style: TextStyle(fontWeight: FontWeight.bold),
),
SizedBox(height: size.height * 0.03),
RoundedInputField(
hintText: "Enter email address",
icon: const Icon(
Icons.email,
),
labelText: "Email",
onChanged: (value) {},
),
RoundedPasswordField(
hintText: "Enter password",
labelText: "Password",
icon: const Icon(
Icons.lock,
),
suffixIcon: const Icon(
Icons.visibility,
color: appPrimaryColour,
),
onChanged: (value) {},
),
RoundedButton(
text: "LOGIN",
onPressed: () {},
),
SizedBox(height: size.height * 0.03),
AlreadyHaveAnAccountCheck(
onTaped: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const SignUpPage(),
),
);
},
),
],
),
),
);
}
}
这是一个可重复使用的小部件,用于显示背景图像或任何其他内容:
class Background extends StatelessWidget {
final Widget child;
const Background({
Key? key,
required this.child,
}) : super(key: key);
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return Container(
height: size.height,
width: double.infinity,
child: Stack(
alignment: Alignment.center,
children: <Widget>[
child,
],
),
);
}
}
class RoundedButton extends StatelessWidget {
final String text;
final Function onPressed;
final Color color, textColor;
const RoundedButton({
Key? key,
required this.text,
required this.onPressed,
this.color = appPrimaryColour,
this.textColor = Colors.white,
}) : super(key: key);
@override
Widget build(BuildContext context) {
var size = MediaQuery.of(context).size;
return Container(
margin: const EdgeInsets.symmetric(vertical: 10),
width: size.width * 0.8,
child: ClipRRect(
borderRadius: BorderRadius.circular(30),
child: newElevatedButton(),
),
);
}
//Used:ElevatedButton as FlatButton is deprecated.
//Here we have to apply customizations to Button by inheriting the styleFrom
Widget newElevatedButton() {
return ElevatedButton(
child: Text(
text,
style: TextStyle(color: textColor),
),
onPressed: () => onPressed,
style: ElevatedButton.styleFrom(
primary: color,
padding: const EdgeInsets.symmetric(horizontal: 40, vertical: 20),
textStyle: TextStyle(
color: textColor, fontSize: 14, fontWeight: FontWeight.w500)),
);
}
}
尝试导航到登录页面时,没有任何反应。有人可以帮帮我吗?
我现在 运行 没主意了,而且我现在看的教程太多了。
您正在 newElevatedButton()
进行 onPressed: () => onPressed
。它正在创建另一个匿名方法,但在其中,您没有调用 onPressed()
.
你可以做到
onPressed: onPressed,
或
onPressed: () => onPressed()
我有这样的页面结构:
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'First App',
theme: ThemeData(
primaryColor: appPrimaryColour,
scaffoldBackgroundColor: appBackGroupCoulour,
),
home: const WelcomePage(),
);
class WelcomePage extends StatelessWidget {
const WelcomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const Scaffold(
body: Body(),
);
}
}
欢迎页正文:
//Body for the welcome page
class Body extends StatelessWidget {
const Body({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return Background(
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
"Welcome To My First App",
style: TextStyle(fontWeight: FontWeight.bold),
),
SizedBox(height: size.height * 0.05),
SizedBox(height: size.height * 0.05),
RoundedButton(
text: "LOGIN",
color: appPrimaryColour,
onPressed: () => {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => const LoginPage(),
),
),
},
),
],
),
),
);
}
}
登录页面传递登录页面的body widget
class LoginPage extends StatelessWidget {
const LoginPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const Scaffold(
body: Body(),
);
}
}
登录正文:
//Body for login
class Body extends StatelessWidget {
const Body({
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return Background(
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
"LOGIN",
style: TextStyle(fontWeight: FontWeight.bold),
),
SizedBox(height: size.height * 0.03),
RoundedInputField(
hintText: "Enter email address",
icon: const Icon(
Icons.email,
),
labelText: "Email",
onChanged: (value) {},
),
RoundedPasswordField(
hintText: "Enter password",
labelText: "Password",
icon: const Icon(
Icons.lock,
),
suffixIcon: const Icon(
Icons.visibility,
color: appPrimaryColour,
),
onChanged: (value) {},
),
RoundedButton(
text: "LOGIN",
onPressed: () {},
),
SizedBox(height: size.height * 0.03),
AlreadyHaveAnAccountCheck(
onTaped: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const SignUpPage(),
),
);
},
),
],
),
),
);
}
}
这是一个可重复使用的小部件,用于显示背景图像或任何其他内容:
class Background extends StatelessWidget {
final Widget child;
const Background({
Key? key,
required this.child,
}) : super(key: key);
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return Container(
height: size.height,
width: double.infinity,
child: Stack(
alignment: Alignment.center,
children: <Widget>[
child,
],
),
);
}
}
class RoundedButton extends StatelessWidget {
final String text;
final Function onPressed;
final Color color, textColor;
const RoundedButton({
Key? key,
required this.text,
required this.onPressed,
this.color = appPrimaryColour,
this.textColor = Colors.white,
}) : super(key: key);
@override
Widget build(BuildContext context) {
var size = MediaQuery.of(context).size;
return Container(
margin: const EdgeInsets.symmetric(vertical: 10),
width: size.width * 0.8,
child: ClipRRect(
borderRadius: BorderRadius.circular(30),
child: newElevatedButton(),
),
);
}
//Used:ElevatedButton as FlatButton is deprecated.
//Here we have to apply customizations to Button by inheriting the styleFrom
Widget newElevatedButton() {
return ElevatedButton(
child: Text(
text,
style: TextStyle(color: textColor),
),
onPressed: () => onPressed,
style: ElevatedButton.styleFrom(
primary: color,
padding: const EdgeInsets.symmetric(horizontal: 40, vertical: 20),
textStyle: TextStyle(
color: textColor, fontSize: 14, fontWeight: FontWeight.w500)),
);
}
}
尝试导航到登录页面时,没有任何反应。有人可以帮帮我吗? 我现在 运行 没主意了,而且我现在看的教程太多了。
您正在 newElevatedButton()
进行 onPressed: () => onPressed
。它正在创建另一个匿名方法,但在其中,您没有调用 onPressed()
.
你可以做到
onPressed: onPressed,
或
onPressed: () => onPressed()