首页 > 解决方案 > 颤振:我无法保持用户登录

问题描述

我想在他第一次登录后保持用户登录,但每次我从手机后台关闭应用程序时,用户注销并且必须从头重新登录

这是我登录的api方法

Future<dynamic> login(String email, String password ) async {
    final Map<String, dynamic> body = {'email': email, 'password': password  };

    _isLoading = true;
    notifyListeners();

    http.Response response = await http.post(Environment.userLogin,
        body: json.encode(body), headers: Environment.requestHeader);

        SharedPreferences prefs = await SharedPreferences.getInstance();

    Map<String, dynamic> res = json.decode(response.body);
    var results;
    if (res['code'] == 200) {

      _user = User.fromJson(res['message']);

      prefs.setString('email', _user.email);
      results = true;
    } else {

      results =
          FailedRequest(code: 400, message: res['error'], status: false);
    }

    _isLoading = false;
    notifyListeners();
    return results;
  }

这是主要功能

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  SharedPreferences prefs = await SharedPreferences.getInstance();
  var email = prefs.getString('email');
  print(email);
  SystemChrome.setPreferredOrientations([
    DeviceOrientation.portraitUp,
    DeviceOrientation.portraitDown,
  ]).then((_) => runApp(new MyApp()));

}

谁能帮我解决这个问题?

标签: flutterdartsharedpreferences

解决方案


DartPad上的示例

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FutureBuilder(
        future: SharedPreferences.getInstance(),
        builder: (BuildContext context, AsyncSnapshot<SharedPreferences> snapshot) {
          if (!snapshot.hasData) return Container();

          final isLoggedIn = snapshot.data.getString("email") != null;
          return isLoggedIn ? Home() : Login();
        },
      ),
    );
  }
}

推荐阅读