【发布时间】: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