flutter 路由到另一页后,控制器尚未初始化

kcugc4gi  于 2023-01-21  发布在  Flutter
关注(0)|答案(1)|浏览(178)

我有一个应用程序,我正在使用。我使用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时不会出现后期初始化错误。
拜托,我需要有人能帮我解决这个问题。
先谢谢你
我已尝试确认已初始化控制器

qxgroojn

qxgroojn1#

将初始化代码放在super.initState()下面;

late final PageController controller;
      @override
      void initState() {
         super.initState();
         ProviderData().loadFromPrefs().then((value) {
         controller = PageController(initialPage: value);
       });
     }

相关问题