我正在嘗試使用共享首選項保存變數值,并在每次啟動應用程式時檢索它。基本上,我正在嘗試將身份驗證邏輯硬編碼到應用程式中。如果用戶知道密碼,應用程式將回傳正確的字串。此外,如果密鑰正確,圖示也會發生變化。當用戶重新打開應用程式時,應用程式應該記住用戶是否輸入了正確的密鑰。
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
var authIcon = const Icon(Icons.lock, color: Colors.redAccent,);
late String enteredPassKEY;
void main() {
runApp(MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Organizer',
initialRoute: '/home',
routes: {
'/home': (context) => const MyHomePage(),
}
));
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key}) : super(key: key);
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
void initState() {
super.initState();
_getVarSharedPref();
}
@override
Widget build(BuildContext context) {
....
MaterialButton(onPressed: () { checkPassKey(); },),
....
}
Future<void> _setPassKEYSharedPref() async{
final prefs= await SharedPreferences.getInstance();
await prefs.setString('passKEY', 'enteredPassKEY');
}
Future<void> _getVarSharedPref() async {
final prefs= await SharedPreferences.getInstance();
setState((){
enteredPassKEY = prefs.getString('passKEY') ?? 'Not_yet_authorised';
if(enteredPassKEY=='ThisIsPassword') {
setState(() {
authIcon = const Icon(Icons.check_circle_sharp, color: Colors.greenAccent,);
});
}
});
}
void checkPassKey(){
if(enteredPassKEY=='ThisIsPassword'){
setState(() {
authIcon= const Icon(Icons.check_circle_sharp, color: Colors.greenAccent,);
});
_setPassKEYSharedPref();
}
}
}
uj5u.com熱心網友回復:
我試圖從你的代碼中構建一個應用程式。這應該會給你一些提示。但在共享首選項中存盤密碼時要小心,因為共享首選項的值并未加密存盤在設備上。
查看軟體包之類的解決方案flutter_secure_storage:
https ://pub.dev/packages/flutter_secure_storage
我目前的猜測是你setState()沒有作業,因為目標變數是在有狀態小部件之外宣告的。
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
runApp(
MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Organizer',
initialRoute: '/home',
routes: {
'/home': (context) => const MyHomePage(),
},
),
);
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key}) : super(key: key);
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final TextEditingController _textInputController = TextEditingController();
bool authenticated = false;
@override
void initState() {
super.initState();
_getVarSharedPref();
}
@override
void dispose() {
_textInputController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: SizedBox(
height: 300,
child: Column(
children: [
TextField(
controller: _textInputController,
decoration: InputDecoration(prefixIcon: _getAuthIcon()),
),
ElevatedButton(
onPressed: checkPassKey,
child: const Text('sign in'),
),
],
),
),
),
);
}
Future<void> _setPassKEYSharedPref() async {
final prefs = await SharedPreferences.getInstance();
// It doesn't make much sense imho, better use a boolean
await prefs.setString('passKEY', 'ThisIsPassword');
}
Future<void> _getVarSharedPref() async {
final prefs = await SharedPreferences.getInstance();
final storedPasskey = prefs.getString('passKEY') ?? 'Not_yet_authorised';
setState(() {
authenticated = storedPasskey == 'ThisIsPassword';
});
}
void checkPassKey() {
final String enteredPassKey = _textInputController.text;
if (enteredPassKey == 'ThisIsPassword') {
setState(() {
authenticated = true;
});
_setPassKEYSharedPref();
}
}
Icon _getAuthIcon() {
return authenticated
? const Icon(Icons.check_circle_sharp, color: Colors.greenAccent)
: const Icon(Icons.lock, color: Colors.redAccent);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/489277.html
