當用戶登錄應用程式時,我需要在 shared_preference 變數中設定“PWD”。我需要在我的應用程式的啟影片面中獲取該值,以便當用戶再次打開應用程式時,它只需要重定向到密碼輸入頁面。我怎么能在顫動中做到這一點。
onPressed: () async {
SharedPreferences prefs = await SharedPreferences.getInstance();
appdata.loginmode = prefs.setString('LOGIN_MODE', 'PWD');
Navigator.push(
context,
MaterialPageRoute(builder: (context) => BottomNavigation()),
);
print('Shared....');
print(prefs.getString('LOGIN_MODE'));
},
這就是我在用戶單擊登錄時所做的事情,它將設定為“PWD”,然后我需要在 splashscree 中呼叫首選項。
uj5u.com熱心網友回復:
簡答
不適用于啟動螢屏,但我對板載螢屏使用相同的邏輯。我希望這個答案會有所幫助。因此,在您的 main.dart 檔案中,在任何類之外創建一個可為空的 int onBoardCount,您將需要在初始螢屏上使用它。此外,在 main 中實體化 SharedPreferences 并將其與 onboardcount 一起傳遞給您 MyApp();
int? onBoardCount;
void main() async {
WidgetsFlutterBinding.ensureInitialized();
SharedPreferences prefs = await SharedPreferences.getInstance();
// Get onboard count from prefs, if it already exists,if not it will return null
onBoardCount = prefs.getInt('onBoardKey');
runApp(MyApp(prefs,onBoardCount));
}
現在,您的 MyApp 檔案應該類似于
class MyApp extends StatefulWidget {
late SharedPreferences prefs;
....
MyApp(this.prefs,this.onBoardCount, ...);
現在在您的 splash_screen.dart 中使用以下邏輯。
void onSubmitDone(AppStateProvider stateProvider, BuildContext context) {
await prefs.setInt('onBoardKey', 0);
// Some route logic like route.push("/home");
}
長答案
我使用 Go Router 進行路由,使用 Provider 進行狀態管理,所以這是我的應用程式代碼。
主要.dart
int? onBoardCount;
void main() async {
WidgetsFlutterBinding.ensureInitialized();
SharedPreferences prefs = await SharedPreferences.getInstance();
onBoardCount = prefs.getInt('onBoardKey');
....
runApp(MyApp(prefs, onBoardCount));
}
我有一個單獨的 MyApp 檔案來減少擁塞。
my_app.dart
class MyApp extends StatefulWidget {
late SharedPreferences prefs;
int? onBoardCount;
MyApp(this.prefs, this.onBoardCount,..... {Key? key})
: super(key: key);
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
// The appstate provider is handling app level state
late AppStateProvider appStateProvider;
@override
void didChangeDependencies() {
super.didChangeDependencies();
appStateProvider = AppStateProvider(
widget.onBoardCount, widget.prefs,....);
}
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
....
ChangeNotifierProvider(
create: (context) => AppStateProvider(
widget.onBoardCount,
widget.prefs,...)),
Provider(
create: (context) => AppRouter(
appStateProvider: appStateProvider,
onBoardCount: widget.onBoardCount,
prefs: widget.prefs,
),
),
],
child: Builder(
builder: ((context) {
final GoRouter router = Provider.of<AppRouter>(context).router;
return MaterialApp.router(
routeInformationParser: router.routeInformationParser,
routerDelegate: router.routerDelegate);
}),
),
);
}
}
應用狀態提供程式檔案
創建一個函式來更新板載邏輯并通知偵聽器。
class AppStateProvider with ChangeNotifier {
AppStateProvider(this.onBoardCount, this.prefs,..);
int? onBoardCount;
late SharedPreferences prefs;
bool? _isOnboarded;
bool get isOnboard => _isOnboarded as bool;
void hasOnBoarded() async {
await prefs.setInt('onBoardKey', 0);
_isOnboarded = true;
notifyListeners();
}
}
在路由器檔案上
class AppRouter {
late AppStateProvider appStateProvider;
late SharedPreferences prefs;
int? onBoardCount;
AppRouter({
required this.appStateProvider,
required this.onBoardCount,
required this.prefs,
});
get router => _router;
late final _router = GoRouter(
refreshListenable: appStateProvider,
initialLocation: "/",
routes: [
...
],
redirect: (state) {
final String onboardLocation =
state.namedLocation("Your Route name");
bool isOnboarding = state.subloc == onboardLocation;
bool? toOnboard = prefs.containsKey('onBoardKey') ? false : true;
print("Is LoggedIn is $isLoggedIn");
if (toOnboard) {
return isOnboarding ? null : onboardLocation;
}
return null;
});
}
由于路由器正在監聽 appStateProvider,一旦你在板載螢屏上呼叫 hasOnBoarded(),它就會改變。
車載螢屏
void onSubmitDone(AppStateProvider stateProvider, BuildContext context) {
stateProvider.hasOnBoarded();
GoRouter.of(context).go("/");
}
我希望這會有所幫助,請發表評論。僅供參考,...是其他一些代碼,我覺得這對這個主題并不重要。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/431595.html
上一篇:未定義名稱“Firestore”
