265 lines
6.7 KiB
Dart
265 lines
6.7 KiB
Dart
|
import 'package:flutter/material.dart';
|
|||
|
|
|||
|
import '../basic/Common.dart';
|
|||
|
import '../basic/Cross.dart';
|
|||
|
import '../basic/Method.dart';
|
|||
|
import 'components/ContentLoading.dart';
|
|||
|
|
|||
|
class ForgotPasswordScreen extends StatefulWidget {
|
|||
|
const ForgotPasswordScreen({Key? key}) : super(key: key);
|
|||
|
|
|||
|
@override
|
|||
|
State<StatefulWidget> createState() => _ForgotPasswordScreenState();
|
|||
|
}
|
|||
|
|
|||
|
class _ForgotPasswordScreenState extends State<ForgotPasswordScreen> {
|
|||
|
bool _loading = false;
|
|||
|
int _state = 0; // 0 输入账号,1 回答问题,2 密码已经找回
|
|||
|
String _email = "";
|
|||
|
String _question1 = "";
|
|||
|
String _question2 = "";
|
|||
|
String _question3 = "";
|
|||
|
String _answer1 = "回答1";
|
|||
|
String _answer2 = "回答2";
|
|||
|
String _answer3 = "回答3";
|
|||
|
String _password = "";
|
|||
|
|
|||
|
@override
|
|||
|
Widget build(BuildContext context) {
|
|||
|
return Scaffold(
|
|||
|
appBar: AppBar(
|
|||
|
title: const Text("找回密码"),
|
|||
|
),
|
|||
|
body: _stateScreen(),
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
Widget _stateScreen() {
|
|||
|
if (_loading) {
|
|||
|
return const ContentLoading(label: '加载中');
|
|||
|
}
|
|||
|
switch (_state) {
|
|||
|
case 0:
|
|||
|
return _inputEmailScreen();
|
|||
|
case 1:
|
|||
|
return _inputAnswerScreen();
|
|||
|
case 2:
|
|||
|
return _showNewPasswordScreen();
|
|||
|
}
|
|||
|
throw '';
|
|||
|
}
|
|||
|
|
|||
|
Widget _inputEmailScreen() {
|
|||
|
return ListView(children: [
|
|||
|
ListTile(
|
|||
|
title: const Text("账号"),
|
|||
|
subtitle: Text(_email == "" ? "未设置" : _email),
|
|||
|
onTap: () async {
|
|||
|
String? input = await displayTextInputDialog(
|
|||
|
context,
|
|||
|
src: _email,
|
|||
|
title: '账号',
|
|||
|
hint: '请输入账号',
|
|||
|
);
|
|||
|
if (input != null) {
|
|||
|
setState(() {
|
|||
|
_email = input;
|
|||
|
});
|
|||
|
}
|
|||
|
},
|
|||
|
),
|
|||
|
Container(
|
|||
|
margin: const EdgeInsets.all(10),
|
|||
|
color: Colors.grey.shade500.withAlpha(18),
|
|||
|
child: MaterialButton(
|
|||
|
onPressed: _confirmEmail,
|
|||
|
child: const Text("确认"),
|
|||
|
),
|
|||
|
),
|
|||
|
]);
|
|||
|
}
|
|||
|
|
|||
|
void _confirmEmail() async {
|
|||
|
if (_email.isEmpty) {
|
|||
|
defaultToast(context, "请输入账号");
|
|||
|
return;
|
|||
|
}
|
|||
|
try {
|
|||
|
setState(() {
|
|||
|
_loading = true;
|
|||
|
});
|
|||
|
var result = await method.forgotPassword(_email);
|
|||
|
_question1 = result.question1;
|
|||
|
_question2 = result.question2;
|
|||
|
_question3 = result.question3;
|
|||
|
_state = 1;
|
|||
|
} catch (e, s) {
|
|||
|
print("$e\n$s");
|
|||
|
defaultToast(context, '$e');
|
|||
|
} finally {
|
|||
|
setState(() {
|
|||
|
_loading = false;
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Widget _inputAnswerScreen() {
|
|||
|
return ListView(children: [
|
|||
|
Container(height: 10),
|
|||
|
ListTile(
|
|||
|
title: const Text("账号"),
|
|||
|
subtitle: Text(_email.isEmpty ? "未设置" : _email),
|
|||
|
),
|
|||
|
Container(height: 10),
|
|||
|
const Divider(),
|
|||
|
Container(height: 10),
|
|||
|
ListTile(
|
|||
|
title: const Text("问题1"),
|
|||
|
subtitle: Text(_question1),
|
|||
|
),
|
|||
|
ListTile(
|
|||
|
title: const Text("回答1"),
|
|||
|
subtitle: Text(_answer1.isEmpty ? "未设置" : _answer1),
|
|||
|
onTap: () async {
|
|||
|
String? input = await displayTextInputDialog(
|
|||
|
context,
|
|||
|
src: _answer1,
|
|||
|
title: '回答1',
|
|||
|
hint: '请输入回答1',
|
|||
|
);
|
|||
|
if (input != null) {
|
|||
|
setState(() {
|
|||
|
_answer1 = input;
|
|||
|
});
|
|||
|
}
|
|||
|
},
|
|||
|
),
|
|||
|
Container(
|
|||
|
margin: const EdgeInsets.all(10),
|
|||
|
color: Colors.grey.shade500.withAlpha(18),
|
|||
|
child: MaterialButton(
|
|||
|
onPressed: () {
|
|||
|
_confirmAnswer(1, _answer1);
|
|||
|
},
|
|||
|
child: const Text("使用回答1找回密码"),
|
|||
|
),
|
|||
|
),
|
|||
|
Container(height: 10),
|
|||
|
const Divider(),
|
|||
|
Container(height: 10),
|
|||
|
ListTile(
|
|||
|
title: const Text("问题2"),
|
|||
|
subtitle: Text(_question2),
|
|||
|
),
|
|||
|
ListTile(
|
|||
|
title: const Text("回答2"),
|
|||
|
subtitle: Text(_answer2.isEmpty ? "未设置" : _answer2),
|
|||
|
onTap: () async {
|
|||
|
String? input = await displayTextInputDialog(
|
|||
|
context,
|
|||
|
src: _answer2,
|
|||
|
title: '回答2',
|
|||
|
hint: '请输入回答2',
|
|||
|
);
|
|||
|
if (input != null) {
|
|||
|
setState(() {
|
|||
|
_answer2 = input;
|
|||
|
});
|
|||
|
}
|
|||
|
},
|
|||
|
),
|
|||
|
Container(
|
|||
|
margin: const EdgeInsets.all(10),
|
|||
|
color: Colors.grey.shade500.withAlpha(18),
|
|||
|
child: MaterialButton(
|
|||
|
onPressed: () {
|
|||
|
_confirmAnswer(2, _answer2);
|
|||
|
},
|
|||
|
child: const Text("使用回答2找回密码"),
|
|||
|
),
|
|||
|
),
|
|||
|
Container(height: 10),
|
|||
|
const Divider(),
|
|||
|
Container(height: 10),
|
|||
|
ListTile(
|
|||
|
title: const Text("问题3"),
|
|||
|
subtitle: Text(_question3),
|
|||
|
),
|
|||
|
ListTile(
|
|||
|
title: const Text("回答3"),
|
|||
|
subtitle: Text(_answer3.isEmpty ? "未设置" : _answer3),
|
|||
|
onTap: () async {
|
|||
|
String? input = await displayTextInputDialog(
|
|||
|
context,
|
|||
|
src: _answer3,
|
|||
|
title: '回答3',
|
|||
|
hint: '请输入回答3',
|
|||
|
);
|
|||
|
if (input != null) {
|
|||
|
setState(() {
|
|||
|
_answer3 = input;
|
|||
|
});
|
|||
|
}
|
|||
|
},
|
|||
|
),
|
|||
|
Container(
|
|||
|
margin: const EdgeInsets.all(10),
|
|||
|
color: Colors.grey.shade500.withAlpha(18),
|
|||
|
child: MaterialButton(
|
|||
|
onPressed: () {
|
|||
|
_confirmAnswer(3, _answer3);
|
|||
|
},
|
|||
|
child: const Text("使用回答3找回密码"),
|
|||
|
),
|
|||
|
),
|
|||
|
/////////
|
|||
|
Container(height: 20),
|
|||
|
]);
|
|||
|
}
|
|||
|
|
|||
|
_confirmAnswer(int answerNo, String answer) async {
|
|||
|
if (answer.isEmpty) {
|
|||
|
defaultToast(context, "请输入答案");
|
|||
|
return;
|
|||
|
}
|
|||
|
try {
|
|||
|
setState(() {
|
|||
|
_loading = true;
|
|||
|
});
|
|||
|
var result = await method.resetPassword(_email, answerNo, answer);
|
|||
|
_password = result.password;
|
|||
|
_state = 2;
|
|||
|
defaultToast(context, "新密码正在复制到剪切板");
|
|||
|
copyToClipBoard(context, _password);
|
|||
|
} catch (e, s) {
|
|||
|
print("$e\n$s");
|
|||
|
if ("$e".contains("invalid request")) {
|
|||
|
defaultToast(context, '答案不正确');
|
|||
|
} else {
|
|||
|
defaultToast(context, '$e');
|
|||
|
}
|
|||
|
} finally {
|
|||
|
setState(() {
|
|||
|
_loading = false;
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Widget _showNewPasswordScreen() {
|
|||
|
return ListView(children: [
|
|||
|
ListTile(
|
|||
|
title: const Text("账号"),
|
|||
|
subtitle: Text(_email.isEmpty ? "未设置" : _email),
|
|||
|
),
|
|||
|
ListTile(
|
|||
|
title: const Text("密码"),
|
|||
|
subtitle: Text(_password.isEmpty ? "未设置" : _password),
|
|||
|
onTap: () {
|
|||
|
defaultToast(context, "新密码正在复制到剪切板");
|
|||
|
copyToClipBoard(context, _password);
|
|||
|
},
|
|||
|
),
|
|||
|
]);
|
|||
|
}
|
|||
|
}
|