Saya menggunakan Penyedia untuk manajemen status aplikasi di Flutter, data Auth disimpan dalam preferensi bersama dan saya ingin memuatnya menggunakan penyedia saat aplikasi dimulai, apa cara terbaik untuk melakukannya.

Saya akan menggunakan status auth untuk memutuskan apakah pengguna harus melihat layar masuk atau layar Dasbor

0
Ravindra 10 Januari 2021, 16:14

3 jawaban

Jawaban Terbaik

Sesuatu seperti ini:

Future<void> main() async {
  final appState = await loadAppStateFromSharedData();

  runApp(
    Provider.value(
      value: appState,
      child: MyApp(),
    ),
  );
}
1
spkersten 10 Januari 2021, 15:28

Ini adalah bagian dari kode yang saya gunakan ketika saya mulai bergetar, implementasikan fungsi lainnya sesuai keinginan.

Main.dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import './providers/authentication.dart';

MultiProvider(
      providers: [
        ChangeNotifierProvider(
          create: (_) => Authentication(),
        ),
      ],
      child: Consumer<Authentication>(
        builder: (ctx, auth, _) => MaterialApp(
          title: 'MyApp',
          home: auth.isAuthorized
              ? MyScreen()
              : FutureBuilder(
                  future: auth.tryLogin(),
                  builder: (ctx, authResultSnapshot) =>
                      authResultSnapshot.connectionState ==
                              ConnectionState.waiting
                          ? SplashScreen()
                          : AuthScreen(),
                ),

Otentikasi.dart

String _token;
DateTime _expiryDate;
String _userId;

 bool get isAuthorized {
    // that is a very simple check
    return token != null;
  }

Future<bool> tryLogin() async {
    final prefs = await SharedPreferences.getInstance();
    if (!prefs.containsKey('userData')) {
      return false;
    }
    final extractedUserData = json.decode(prefs.getString('userData')) as Map<String, Object>;
    final expiryDate = DateTime.parse(extractedUserData['expiryDate']);

    if (expiryDate.isBefore(DateTime.now())) {
      return false;
    }
    _token = extractedUserData['token'];
    _userId = extractedUserData['userId'];
    _expiryDate = expiryDate;
    notifyListeners();
    return true;
  }
0
Michael Soliman 10 Januari 2021, 15:46

Coba yang ini!

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer<Auth>(
        builder: (ctx, auth, _) => MaterialApp(
          title: 'AppName',
          home: auth.isAuth
              ? DashboardScreen()
              : AuthScreen(),
        ),
      ),
  };
}
0
ShomaEA 14 Januari 2021, 08:44