欢迎、引导 登录、注册 主页
从 Flutter 2.0 开始学 - 路由封装、界面跳转、登录注册 UI - 图1 从 Flutter 2.0 开始学 - 路由封装、界面跳转、登录注册 UI - 图2 从 Flutter 2.0 开始学 - 路由封装、界面跳转、登录注册 UI - 图3

Flutter 路由跳转

界面跳转 push 相当于是一个入栈操作

界面返回 pop 相当于是一个出栈操作

从 Flutter 2.0 开始学 - 路由封装、界面跳转、登录注册 UI - 图4

封装 Fluro 路由工具类

fluro 提供了对路由入栈和出栈,在跳转和返回界面也可以设置对应参数控制(动画、时间、入栈方向、是否替换/清空)

Android activity startActivity

iOS pushViewController popViewController

封装 navigate_util.dart

  • core -> utils -> navigate_util.dart
  1. import 'package:fluro/fluro.dart';
  2. import 'package:moose_app/ui/routers/application.dart';
  3. class ATHNavigator {
  4. // 入栈
  5. static push(context, path) {
  6. ATHApplication.router
  7. .navigateTo(context, path, transitionDuration: Duration(seconds: 1));
  8. }
  9. // 出栈
  10. static pop(context) {
  11. ATHApplication.router.pop(context);
  12. }
  13. // 从右边入栈
  14. static pushFromRight(context, path) {
  15. ATHApplication.router
  16. .navigateTo(context, path, transition: TransitionType.inFromRight);
  17. }
  18. // 1s 从右边入栈
  19. static pushFromRightDuration(context, path) {
  20. ATHApplication.router.navigateTo(context, path,
  21. transition: TransitionType.inFromRight,
  22. transitionDuration: Duration(seconds: 1));
  23. }
  24. // 入栈 谈入动画
  25. static pushFadeIn(context, path) {
  26. ATHApplication.router.navigateTo(context, path,
  27. transition: TransitionType.fadeIn,
  28. transitionDuration: Duration(seconds: 1));
  29. }
  30. // 入栈替换,clearStack 是否清空栈
  31. static pushReplace(context, path, {clearStack: false}) {
  32. ATHApplication.router.navigateTo(context, path,
  33. replace: true,
  34. clearStack: clearStack,
  35. transition: TransitionType.fadeIn,
  36. transitionDuration: Duration(seconds: 0));
  37. }
  38. // 入栈替换 谈入
  39. static pushFadeInReplace(context, path) {
  40. ATHApplication.router.navigateTo(context, path,
  41. replace: true,
  42. transition: TransitionType.fadeIn,
  43. transitionDuration: Duration(seconds: 0));
  44. }
  45. }

登录界面

  • 创建登录界面

    • lib/ui/screens/login

ATHLoginScreen

  • login_screen.dart
  1. import 'package:flutter/material.dart';
  2. import 'login_body.dart';
  3. class ATHLoginScreen extends StatelessWidget {
  4. static final String routeName = "app://login";
  5. ATHLoginScreen({Key key}) : super(key: key);
  6. @override
  7. Widget build(BuildContext context) {
  8. // flutter material 自带脚手架
  9. return Scaffold(
  10. body: ATHLoginBody(),
  11. );
  12. }
  13. }

Scaffold Flutter 自带组件,可以设置 appBar、floatingActionButton、drawer …,用于快速构建展示视图

ATHLoginBody

  • login_body.dart
  1. ....
  2. import 'login_background.dart';
  3. class ATHLoginBody extends StatefulWidget {
  4. ATHLoginBody({Key key}) : super(key: key);
  5. @override
  6. _LoginBodyState createState() => _LoginBodyState();
  7. }
  8. class _LoginBodyState extends State<ATHLoginBody> {
  9. final TextEditingController _usernameController = TextEditingController();
  10. final TextEditingController _passwordController = TextEditingController();
  11. @override
  12. void initState() {
  13. super.initState();
  14. _usernameController.text = "江景";
  15. _passwordController.text = "123";
  16. }
  17. void _onLoginButtonPressed() async {
  18. ATHNavigator.pushReplace(context, ATHMainScreen.routeName,
  19. clearStack: true);
  20. }
  21. @override
  22. Widget build(BuildContext context) {
  23. return GestureDetector(
  24. onTap: () {
  25. ATHFocusUtil.requestFocus(context);
  26. },
  27. child: ATHLoginBackground(
  28. child: SingleChildScrollView(
  29. child: Column(
  30. mainAxisAlignment: MainAxisAlignment.center,
  31. children: <Widget>[
  32. Image.asset(
  33. 'assets/images/login.png',
  34. height: 400.h,
  35. ),
  36. ATHAuthAccountInput(
  37. hintText: "账号",
  38. controller: _usernameController,
  39. // onChanged: (value) => {print('$value')},
  40. ),
  41. ATHAuthPasswordInput(
  42. hintText: "密码",
  43. controller: _passwordController,
  44. // onChanged: (value) => {},
  45. ),
  46. ATHAuthButton(
  47. text: "登录",
  48. press: () {
  49. ATHFocusUtil.requestFocus(context);
  50. _onLoginButtonPressed();
  51. },
  52. ),
  53. ATHUserAlready(
  54. login: true,
  55. press: () {
  56. ATHNavigator.pushReplace(
  57. context, ATHRegisterScreen.routeName);
  58. },
  59. ),
  60. ],
  61. ),
  62. ),
  63. ));
  64. }
  65. }

GestureDetector : Flutter 中手势事件

TextEditingController : 文本编辑控制器,可以监听文本框改变

ATHFocusUtil : 获取焦点工具类

SingleChildScrollView :Flutter 组件单个子组件滚动容器

ATHLoginBackground

  • login_background.dart
  1. import 'package:flutter/material.dart';
  2. class ATHLoginBackground extends StatelessWidget {
  3. final Widget child;
  4. const ATHLoginBackground({Key key, @required this.child}) : super(key: key);
  5. @override
  6. Widget build(BuildContext context) {
  7. Size size = MediaQuery.of(context).size;
  8. return Container(
  9. height: size.height,
  10. width: double.infinity,
  11. child: Stack(
  12. alignment: Alignment.center,
  13. children: <Widget>[
  14. child,
  15. ],
  16. ),
  17. );
  18. }
  19. }

Container: Flutter 容器组件

MediaQuery.of(context).size 获取屏幕尺寸

Stack:容器组件,可以根据 Position 放置不同位置子组件

注册界面

和登录界面基本一致,只需要把封装好的容器一个个按照顺序摆放就行