繁体   English   中英

我正在 flutter 中实现 Splash Screen 我正在使用 sharedPreferences 我面临着延迟初始化错误

[英]I am implementing Splash Screen in flutter along with it i am using sharedPreferences I am facing late initialisation error in it

在这里,我实现了启动画面,在 main.dart 中,我将其指定为 home:SplashScreen(); 在这里,我还实现了 sharedPreferences,现在我面临以下初始化错误:static late SharedPreferences pref; 我不明白如何解决它以及在哪里声明 pref 变量 import 'package:flutter/material.dart';

import 'package:onesignal_flutter/onesignal_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';

import 'View/LoginPage.dart';
import 'View/homePageAdmin.dart';

class SplashScreen extends StatefulWidget {
  @override
  State<SplashScreen> createState() => _SplashScreenState();
}

class SharedPrefService {
  static late SharedPreferences pref;

  static Future<void> init() async {
    await SharedPrefService.init();

    SharedPrefService.pref = await SharedPreferences.getInstance();
    var usrEmail = pref.getString('email');
    String usrname = pref.getString('username').toString();
  }
}

class _SplashScreenState extends State<SplashScreen> {
  String playerId = '';

  var usrEmail = SharedPrefService.pref.getString('email');
  String usrname = SharedPrefService.pref.getString('username').toString();
  @override
  void initState() async {
    SharedPrefService.pref = await SharedPreferences.getInstance();
    super.initState();
    await SharedPrefService.init();

    initPlatformState();

    _navigateToHome();
  }

  Future<void> initPlatformState() async {
    String usrname = SharedPrefService.pref.getString('username').toString();

    OneSignal.shared.setAppId('e89acaa4-5388-4e3a-bd69-44d197bdcbd7');
    // OneSignal.shared
    //     .promptUserForPushNotificationPermission()
    //     .then((accepted) {});
    final status = await OneSignal.shared.getDeviceState();
    final String? osUserID = status?.userId;
    print('The player id from main.dart ...........${osUserID}');
    // OneSignal.shared.setNotificationOpenedHandler(
    //     (OSNotificationOpenedResult result) async {
    //   var id1 = await result.notification.additionalData!["Docid"];

    //   final int docid = int.parse(id1).toInt();

    //   navigatorKey.currentState!.push(MaterialPageRoute(
    //       builder: (context) => DocumentsDetails(docid, usrname)));
    // });

    setState(() {
      this.playerId = osUserID!;
    });
    print('this.playerid from main.dart ${this.playerId}');
  }

  _navigateToHome() async {
    String pId = this.playerId;

    await Future.delayed(Duration(milliseconds: 1500), () {});
    Navigator.pushReplacement(
        context,
        MaterialPageRoute(
          builder: (context) => usrEmail == null
              ? LoginPage()
              : homePageAdmin(
                  pId,
                  usrname,
                ),
        ));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Container(
          child: Text(
            'Splash Screen',
            style: TextStyle(
                fontSize: 25,
                fontWeight: FontWeight.bold,
                color: Colors.blueAccent),
          ),
        ),
      ),
    );
  }
}

当您在初始化之前使用late变量时会发生此错误。

解决方案:将late变量设为nullable变量,例如:

class SharedPrefService {
  static SharedPreferences? pref; // nullable variable

  static Future<void> init() async {
    await SharedPrefService.init();

    SharedPrefService.pref = await SharedPreferences.getInstance();
    var usrEmail = pref?.getString('email'); 
    String usrname = pref!.getString('username').toString();
  }
}

您不能只使initState async并期望它起作用。 是的,它将是异步的,但由于它仍在返回void ,因此无法等待。 因此,它将被调用,然后您的程序将继续执行而无需等待它。

你似乎有一个Future而不是真的知道如何在 Flutter 小部件中处理它。 我建议得到一个很好的概述:

什么是 Future 以及如何使用它?

解决方案是使用某种状态管理来处理您正在后台执行某些操作这一事实。 您的显示器等不及了。 必须显示出来。 显而易见的解决方案是在您等待 Future 解决时使用某种微调器或加载屏幕。 上面的链接中有一个FutureBuilder的简单示例,或者您可以使用更强大的解决方案。 就个人而言,我更喜欢bloc ,但也有很多其他的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM