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(),
),
],
);
}
}