【问题标题】:getter 在我的颤振代码中使用框返回 null
【发布时间】:2022-01-23 15:23:31
【问题描述】:

这是我的 main.dart 我的代码有什么问题吗,因为我的 getter 在终端中抛出 null 并且屏幕卡住了

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  BlocSupervisor.delegate = SimpleBlocDelegate();
  final document = await getApplicationDocumentsDirectory();
  Hive.init(document.path);
  Hive.registerAdapter(GetConfigModelAdapter());
  Hive.registerAdapter(AppConfigAdapter());
  Hive.registerAdapter(AdsConfigAdapter());
  Hive.registerAdapter(AuthUserAdapter());
  await Hive.openBox<GetConfigModel>('getConfigbox');
  await Hive.openBox<AppConfig>('appConfigbox');
  await Hive.openBox<AdsConfig>('adsConfigbox');
  await Hive.openBox<AuthUser>('user');
  await Hive.openBox('seenBox');
  GetConfigModel getConfigModel;
  getConfigModel = await Repository().getAppConfig();
  GetConfigService().updateGetConfig(getConfigModel);
  Admob.initialize();
  runApp(MyApp());
}

String getAppId(AdsConfig adsConfig) {
  if (Platform.isIOS) {
    print(adsConfig.admobAppId);
    return adsConfig.admobAppId;
  } else if (Platform.isAndroid) {
    return adsConfig.admobAppId;
  }
  return null;
}

my app.dart file

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with AfterLayoutMixin {
  GetConfigModel getConfigModel;
  bool isFirstSeen = false;
  String notifyContent;

  @override
  void initState() {
    printLog("_MyAppState initState");
    Future.delayed(
      Duration(seconds: 1),
      () {
        MyConnectivity.instance.initialise();
        MyConnectivity.instance.myStream.listen((onData) {
          printLog("[_MyAppState] internet issue change: $onData");

          if (MyConnectivity.instance.isIssue(onData)) {
            if (MyConnectivity.instance.isShow == false) {
              MyConnectivity.instance.isShow = true;
              showDialogNotInternet(context).then((onValue) {
                MyConnectivity.instance.isShow = false;
                printLog("[showDialogNotInternet] dialog closed $onValue");
              });
            }
          } else {
            if (MyConnectivity.instance.isShow == true) {
              Navigator.of(context).pop();
              MyConnectivity.instance.isShow = false;
            }
          }
        });
      },
    );
    super.initState();
    configOneSignal();
  }

  @override
  Future<void> afterFirstLayout(BuildContext context) async {
    printLog("[_MyAppState] afterFirstLayout");
    isFirstSeen = await checkFirstSeen();
    setState(() {});
  }

  Future checkFirstSeen() async {
    var box = Hive.box('seenBox');
    bool _seen = await box.get("isFirstSeen") ?? false;
    if (_seen) {
      return false;
    } else {
      await box.put("isFirstSeen", true);
      return true;
    }
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    printLog("MyAppState");
    return MultiProvider(
      providers: [
        Provider<AuthService>(
          create: (context) => AuthService(),
        ),
        Provider<GetConfigService>(
          create: (context) => GetConfigService(),
        ),
      ],
      child: MultiBlocProvider(
        providers: [
          BlocProvider(create: (context) => LoginBloc(Repository())),
          BlocProvider(create: (context) => RegistrationBloc(Repository())),
          BlocProvider(create: (context) => FirebaseAuthBloc(Repository())),
          BlocProvider(
              create: (context) =>
                  PhoneAuthBloc(userRepository: UserRepository())),
        ],
        child: MaterialApp(
          debugShowCheckedModeBanner: false,
          routes: Routes.getRoute(),
          home: RenderFirstScreen(
            isFirstSeen: isFirstSeen,
          ),
        ),
      ),
    );
  }

  void configOneSignal() async {
    await OneSignal.shared.init(Config.oneSignalAppID);
    //show notification content
    OneSignal.shared
        .setInFocusDisplayType(OSNotificationDisplayType.notification);
    OneSignal.shared.setNotificationReceivedHandler((notification) {
      //content notification
      setState(() {
        notifyContent =
            notification.jsonRepresentation().replaceAll('\\n', '\n');
      });
    });
  }
}

// ignore: must_be_immutable
class RenderFirstScreen extends StatelessWidget {
  bool isMandatoryLogin = false;
  final bool isFirstSeen;

  RenderFirstScreen({Key key, this.isFirstSeen}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    printLog("RenderFirstScreen");
    return ValueListenableBuilder(
      valueListenable: Hive.box<GetConfigModel>('getConfigbox').listenable(),
      builder: (context, box, widget) {
        isMandatoryLogin = box.get(0).appConfig.mandatoryLogin;
        return renderFirstScreen(isMandatoryLogin);
      },
    );
  }

  Widget renderFirstScreen(bool isMandatoryLogin) {
    print(isMandatoryLogin);
    if (isFirstSeen) {
      return OnBoardScreen(
        isMandatoryLogin: isMandatoryLogin,
      );
    } else if (isMandatoryLogin) {
      return LoginPage();
    } else {
      return MainScreen();
    }
  }
}

这让我返回 null 并且我的应用程序只是卡在启动屏幕上有人知道如何解决这个问题我确实尝试降级 Flutter sdk 但我仍然遇到同样的问题

【问题讨论】:

  • 究竟什么是重调null?请添加行

标签: android flutter flutter-hive


【解决方案1】:

我认为error 在这一行

bool _seen = await box.get("isFirstSeen") ?? false;

原因是您之前没有在此键 isFirstSeen 中输入任何值,但您正在尝试获取它,所以它只是返回 null

您可以做的是在initStatee 的键isFirstSeen 中设置一些值,然后尝试访问它。这应该可以解决您的问题。

【讨论】:

  • 我该怎么做?当我尝试改变价值观时,你能帮我解决这个问题吗? @diwyansh
  • 以上解决方法你试过了吗?
猜你喜欢
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 2022-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 2020-12-09
相关资源
最近更新 更多