avatar

松果工作室

欢迎光临

  • 首页
  • ESP
  • LVGL
  • freeRTOS
  • 快速笔记
  • 考察日志
  • 个人收藏
  • 我的服务
Home (Flutter)登录页面
文章

(Flutter)登录页面

Posted 2025-04-14 Updated 2025-04- 15
By YCP
9~11 min read

CODE

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_login/flutter_login.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() {
  return runApp(MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: MyHomePage(),
      theme: ThemeData(
        primarySwatch: Colors.deepPurple,
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Future<String?> onLogin(LoginData data) async {
    final prefs = await SharedPreferences.getInstance();
    final usersJson = prefs.getString('users');

    if (usersJson == null) return 'User not found';

    final List<dynamic> users = jsonDecode(usersJson);
    final user = users.firstWhere(
          (u) => u['username'] == data.name,
      orElse: () => null,
    );

    if (user == null) return 'User not found';
    if (user['password'] != data.password) return 'Wrong password';

    Navigator.pushReplacement(
      context,
      MaterialPageRoute(builder: (context) => SuccessPage()),
    );
    return null;
  }

  Future<String?> signup(SignupData data) async {
    final prefs = await SharedPreferences.getInstance();
    final usersJson = prefs.getString('users');
    final List<dynamic> users = usersJson != null ? jsonDecode(usersJson) : [];

    final exists = users.any((u) => u['name'] == data.name);
    if (exists) return 'Username already exists';

    users.add({
      'name': data.name,
      'password': data.password,
    });

    await prefs.setString('users', jsonEncode(users));

    // 添加注册成功后自动跳转到登录页面
    WidgetsBinding.instance.addPostFrameCallback((_) {
      Navigator.of(context).pushReplacement(
        MaterialPageRoute(builder: (context) => MyHomePage()),
      );
    });

    return null;
  }

  Future<String?> onRecoverPassword(String email) {
    return Future.value('Password reset not supported');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: FlutterLogin(
        onLogin: onLogin,
        onSignup: signup,
        onRecoverPassword: onRecoverPassword,
        loginProviders: [],
        // 添加注册完成后的提示信息
        messages: LoginMessages(
          signUpSuccess: "注册成功,已返回登录页面",
        ),
      ),
    );
  }
}

class SuccessPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Welcome'),
        actions: [
          IconButton(
            icon: Icon(Icons.exit_to_app),
            onPressed: () {
              Navigator.pushReplacement(
                context,
                MaterialPageRoute(builder: (context) => MyHomePage()),
              );
            },
          ),
        ],
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              'Login Successful!',
              style: Theme.of(context).textTheme.headline4,
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                Navigator.pushReplacement(
                  context,
                  MaterialPageRoute(builder: (context) => MyHomePage()),
                );
              },
              child: Text('退出登录'),
            ),
          ],
        ),
      ),
    );
  }
}

预览

截屏2025-04-14 下午9.39.10.png
截屏2025-04-14 下午9.39.27.png

实现了什么

  1. 注册账号,账号储存在本地,注册完成跳转回主页面
  2. 登录,与本地账号比对
  3. 登录成功跳转到主页面
Flutter
License:  CC BY 4.0
Share

Further Reading

OLDER

(Flutter)导航栏

NEWER

(Flutter)进度列表

Recently Updated

  • (ESP-IDF)LVGL 模拟器
  • (ESP-IDF)LVGL 自定义对象加入编码器组
  • (ESP-IDF)vscode配置文件
  • (Elec)来复再生式晶体管单管收音机
  • (ESP-IDF)ESPNOW

Trending Tags

LVGL WCH Linux Elec ThatProject freeRTOS STM ESP Flutter Others

Contents

©2026 松果工作室. Some rights reserved.

Using the Halo theme Chirpy