Flutter 如何将有状态小部件中的initState替换为provider模式,并将无状态替换为有状态

Flutter 如何将有状态小部件中的initState替换为provider模式,并将无状态替换为有状态,flutter,dart,Flutter,Dart,如何在提供程序模式下使用initState(),而不是使用statefull小部件 这是我拥有的提供者类: import 'package:flutter/material.dart'; class NavigationBBarData extends ChangeNotifier { int currentIndex = 0; PageController pageController; final GlobalKey<FormFieldState<String&g

如何在提供程序模式下使用
initState()
,而不是使用statefull小部件

这是我拥有的提供者类:

import 'package:flutter/material.dart';

class NavigationBBarData extends ChangeNotifier {
  int currentIndex = 0;
  PageController pageController;

  final GlobalKey<FormFieldState<String>> orderFormKey = GlobalKey();

  void pageChanged(int index) {
    currentIndex = index;
    notifyListeners();
  }

  void animateToPage() {
    pageController.animateToPage(currentIndex,
        duration: Duration(milliseconds: 500), curve: Curves.linear);
    notifyListeners();
  }
}

因此,我想在这里使用无状态小部件,而不是使用提供者状态管理的有状态小部件。

我还没有测试代码,但我认为类似的东西应该可以工作。当代码运行时,它将运行build方法,然后该方法将在小部件树中搜索提供者。一旦找到提供程序,它会将其设置为
navigationBBarData
,然后您可以访问提供程序
PageController
,并将其设置为您喜欢的设置

class IPetNavHomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    NavigationBBarData navigationBBarData =
        Provider.of<NavigationBBarData>(context, listen: false);
    navigationBBarData.PageController = PageController(
      initialPage: navigationBBarData.currentIndex,
      keepPage: true,
    );
    return Stack(
      children: [
        IPetPageView(),
        Positioned(
          left: 0,
          right: 0,
          bottom: 0,
          child: IPetBottomNavBar(),
        ),
      ],
    );
  }
}
class IPetNavHomeScreen扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
导航BBARDATA导航BBARDATA=
Provider.of(上下文,listen:false);
navigationBBarData.PageController=PageController(
初始页:navigationBBarData.currentIndex,
基帕奇:是的,
);
返回堆栈(
儿童:[
IPetPageView(),
定位(
左:0,,
右:0,,
底部:0,
子项:IPetBottomNavBar(),
),
],
);
}
}

我不知道如何在提供程序中执行此操作。我已经从这一点转移到了RiverPod,而这在RiverPod中是微不足道的。@RandalSchwartz我看到我可以在文档中使用provider来完成它,但无法找到方法。。。我相信有办法做到这一点,顺便说一句,谢谢你的支持:)
class IPetNavHomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    NavigationBBarData navigationBBarData =
        Provider.of<NavigationBBarData>(context, listen: false);
    navigationBBarData.PageController = PageController(
      initialPage: navigationBBarData.currentIndex,
      keepPage: true,
    );
    return Stack(
      children: [
        IPetPageView(),
        Positioned(
          left: 0,
          right: 0,
          bottom: 0,
          child: IPetBottomNavBar(),
        ),
      ],
    );
  }
}