我有一个应用程序,我正在使用。我使用sharedpreferences和provider来存储屏幕的页面浏览量索引,这样当我从主页单击按钮时,它会导航到PageViewScreen,并从离开应用程序之前的页面浏览屏幕的最后一个索引页继续。然而,当我单击按钮导航到PageViewScreen时,我总是得到"LateInitializationError:字段"控制器"尚未初始化。"。但当我热重新加载时,错误消失。
这是我的提供程序和共享首选项文件
import 'package:flutter/cupertino.dart';
import 'package:shared_preferences/shared_preferences.dart';
class ProviderData extends ChangeNotifier {
SharedPreferences? prefs;
final String pageIndexKey = 'pageIndex';
int? _pageIndex;
ProviderData() {
_pageIndex = 0;
loadFromPrefs();
}
_initPrefs() async {
prefs ??= await SharedPreferences.getInstance();
}
loadFromPrefs() async {
await _initPrefs();
_pageIndex = prefs!.getInt(pageIndexKey) ?? 0;
notifyListeners();
return _pageIndex;
}
_savePageIndexToPrefs({required String key, required int value}) async {
await _initPrefs();
prefs!.setInt(key, value);
}
void changePageIndex(int newPageIndex) {
_pageIndex = newPageIndex;
_savePageIndexToPrefs(key: pageIndexKey, value: _pageIndex!);
notifyListeners();
}
}
这是一个按钮,它可以进入页面浏览屏幕
SizedBox(
width: 350,
child: ElevatedButton(
onPressed: () {
/////route here
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PageViewScreen()));
/////
},
style: ElevatedButton.styleFrom(
backgroundColor: Color.fromRGBO(215, 60, 16, 1),
textStyle: TextStyle(color: Colors.white, fontSize: 14),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(100),
side: BorderSide(color: Colors.transparent)),
padding: EdgeInsets.all(16),
),
child: Text("Continue"),
),
),
下面是我的页面视图屏幕,
我在下面初始化了我的pageView控制器,我给页面控制器赋值,并得到initState中的最后一个索引。
late final PageController controller;
@override
void initState() {
ProviderData().loadFromPrefs().then((value) {
controller = PageController(initialPage: value);
});
super.initState();
}
这是我在PageViewScreen中使用控制器的地方
Consumer<ProviderData>(
builder: (context, providerData, child) {
return PageView(
// I use the controller here and some other places in the code,
controller: controller,
//
onPageChanged: (index) {
providerData.changePageIndex(index);
setState(() {
onLastPage = index == 2;
onFirstPage = index == 0;
onSecondPage = index == 1;
onThirdPage = index == 2;
onFourthPage = index == 3;
onFifthPage = index == 4;
onSixthPage = index == 5;
onSeventhPage = index == 6;
});
},
children: _pageList,
);
},
),
主要的问题是在点击按钮后出现初始化错误,导致PageViewScreen。在热加载时,初始化错误消失,代码控制器工作正常。但我正在寻找一个解决方案,在移动到PageView时不会出现后期初始化错误。
拜托,我需要有人能帮我解决这个问题。
先谢谢你
我已尝试确认已初始化控制器
1条答案
按热度按时间qxgroojn1#
将初始化代码放在super.initState()下面;