如何使用Redux在颤振中使用Pagview页面控制器

如何使用Redux在颤振中使用Pagview页面控制器,redux,flutter,Redux,Flutter,我在Flutter中使用Redux(我刚刚开始学习这两种方法)。我一直在试图找出如何使用PageView的PageController在PageView的页面之间切换 但是,每当我尝试使用PageController.jumpToPage()函数时,都会出现一个异常,说明: “在完成小部件树时引发了以下断言:小部件树被锁定时调用的setState()或markNeedsBuild()。” 当我尝试调用reducer中的PageController.jumpToPage()时,它会导航到pagev

我在Flutter中使用Redux(我刚刚开始学习这两种方法)。我一直在试图找出如何使用PageView的PageController在PageView的页面之间切换

但是,每当我尝试使用PageController.jumpToPage()函数时,都会出现一个异常,说明:

“在完成小部件树时引发了以下断言:小部件树被锁定时调用的setState()或markNeedsBuild()。”

当我尝试调用reducer中的PageController.jumpToPage()时,它会导航到pageview中的页面;但是会抛出异常

我还尝试在reducer中构建一个新的PageController,并将PageController的初始页面属性设置为所需的页面,但这似乎没有起到任何作用

我已经没有办法自己解决这个问题了,所以我想在这里问一下。任何帮助都将不胜感激

我收集了一个快速样本,展示了我正在尝试做的事情:

import 'package:flutter/material.dart';
import 'package:redux/redux.dart';
import 'package:flutter_redux/flutter_redux.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  final store = Store<AppState>(appReducer,
      initialState: AppState.initial(), middleware: []);

  @override
  Widget build(BuildContext context) {
    return StoreProvider(
      store: store,
      child: MaterialApp(
        title: 'PageView Example With Redux',
        home: MyPageViewContainer(),
      ),
    );
  }
}

class AppState {
  final List<Widget> pageViewList;
  final PageController pageController;

  AppState({
    this.pageViewList,
    this.pageController,
  });

  factory AppState.initial() {
    return AppState(
      pageViewList: [
        PageOne(),
        PageTwo(),
      ],
      pageController: PageController(initialPage: 0),
    );
  }

  AppState copyWith({
    List<Widget> pageViewList,
    PageController pageController,
  }) {
    return AppState(
      pageViewList: pageViewList ?? this.pageViewList,
      pageController: pageController ?? this.pageController,
    );
  }
}

AppState appReducer(AppState state, action) {   

  if (action is NavigateToPageOneAction) {
      state.pageController.jumpToPage(0);
    return state;
  }
  else if (action is NavigateToPageTwoAction) {
    state.pageController.jumpToPage(1);
    return state;
  }
  else {
    return state;
  }      
}

class NavigateToPageOneAction {}

class NavigateToPageTwoAction {}

class MyPageView extends StatelessWidget {
  final List<Widget> pageViewList;
  final PageController pageController;
  final Function onPageChanged;

  MyPageView({
    this.pageViewList,
    this.pageController,
    this.onPageChanged,
  });

  @override
  Widget build(BuildContext context) {
    return PageView(
      controller: pageController,
      children: pageViewList,
      onPageChanged: onPageChanged,
    );
  }
}

class MyPageViewContainer extends StatelessWidget {
  MyPageViewContainer({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return StoreConnector<AppState, _MyPageViewModel>(
      converter: (Store<AppState> store) => _MyPageViewModel.create(store),
      builder: (BuildContext context, _MyPageViewModel vm) {
        return MyPageView(
          pageViewList: vm.pageViewList,
          pageController: vm.pageController,
        );
      },
    );
  }
}

class _MyPageViewModel {
  final List<Widget> pageViewList;
  final PageController pageController;
  final Function onPageChanged;

  _MyPageViewModel({
    this.pageViewList,
    this.pageController,
    this.onPageChanged,
  });

  factory _MyPageViewModel.create(Store<AppState> store) {
    _onPageChanged() {}

    return _MyPageViewModel(
      pageViewList: store.state.pageViewList,
      pageController: store.state.pageController,
      onPageChanged: _onPageChanged(),
    );
  }
}

class PageOne extends StatelessWidget {
  PageOne();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Page One"),
      ),
      backgroundColor: Colors.black,
      body: Column(),
      drawer: MyDrawer(),
    );
  }
}

class PageTwo extends StatelessWidget {
  PageTwo();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Page Two"),
      ),
      backgroundColor: Colors.blue,
      body: Column(),
      drawer: MyDrawer(),
    );
  }
}

class MyDrawer extends StatelessWidget {
  MyDrawer({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return StoreConnector<AppState, _MyDrawerViewModel>(
      converter: (Store<AppState> store) => _MyDrawerViewModel.create(store),
      builder: (BuildContext context, _MyDrawerViewModel vm) {
        return Drawer(
          child: ListView(
            children: <Widget>[
              Container(
                child: ListTile(
                  title: Text(vm.pageOneText),
                  onTap: vm.pageOneOnTap,
                ),
              ),
              Container(
                child: ListTile(
                  title: Text(vm.pageTwoText),
                  onTap: vm.pageTwoOnTap,
                ),
              ),
            ],
          ),
        );
      },
    );
  }
}

class _MyDrawerViewModel {
  final String pageOneText;
  final String pageTwoText;
  final Function pageOneOnTap;
  final Function pageTwoOnTap;

  _MyDrawerViewModel({
    this.pageOneText,
    this.pageTwoText,
    this.pageOneOnTap,
    this.pageTwoOnTap,
  });

  factory _MyDrawerViewModel.create(Store<AppState> store) {
    _goToPageOne() {

     store.dispatch(NavigateToPageOneAction());
    }

   _goToPageTwo() {

     store.dispatch(NavigateToPageTwoAction());
   }

    return _MyDrawerViewModel(
      pageOneText: "Page One",
      pageTwoText: "Page Two",
      pageOneOnTap: _goToPageOne,
      pageTwoOnTap: _goToPageTwo,
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“package:redux/redux.dart”;
导入“包:flutter_redux/flutter_redux.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
最终存储=存储(通知者,
initialState:AppState.initial(),中间件:[]);
@凌驾
小部件构建(构建上下文){
返回存储提供程序(
店:店,,
孩子:MaterialApp(
标题:“带Redux的页面视图示例”,
主页:MyPageViewContainer(),
),
);
}
}
类AppState{
最终列表页面查看列表;
最终页面控制器页面控制器;
AppState({
这个.pageViewList,
这个.pageController,
});
工厂AppState.initial(){
返回AppState(
页面视图列表:[
第一页(),
第二页(),
],
pageController:pageController(初始页:0),
);
}
AppState copyWith({
列表页面查看列表,
页控制器页控制器,
}) {
返回AppState(
pageViewList:pageViewList??this.pageViewList,
pageController:pageController??this.pageController,
);
}
}
AppState程序(AppState状态,操作){
如果(操作为NavigateToPageOneAction){
状态.pageController.jumpToPage(0);
返回状态;
}
else if(操作为NavigateToPageTwoAction){
状态.pageController.jumpToPage(1);
返回状态;
}
否则{
返回状态;
}      
}
类NavigateToPageOneAction{}
类NavigateToPageTwoAction{}
类MyPageView扩展了无状态小部件{
最终列表页面查看列表;
最终页面控制器页面控制器;
更改页面上的最终功能;
MyPageView({
这个.pageViewList,
这个.pageController,
本页已更改,
});
@凌驾
小部件构建(构建上下文){
返回页面视图(
控制器:页面控制器,
子项:页面视图列表,
onPageChanged:onPageChanged,
);
}
}
类MyPageViewContainer扩展了无状态小部件{
MyPageViewContainer({Key}):超级(Key:Key);
@凌驾
小部件构建(构建上下文){
返回存储连接器(
转换器:(存储)=>\u MyPageViewModel.create(存储),
生成器:(BuildContext上下文,_myPageViewModelVM){
返回MyPageView(
pageViewList:vm.pageViewList,
pageController:vm.pageController,
);
},
);
}
}
类_MyPageViewModel{
最终列表页面查看列表;
最终页面控制器页面控制器;
更改页面上的最终功能;
_MyPageViewModel({
这个.pageViewList,
这个.pageController,
本页已更改,
});
factory\u MyPageViewModel.create(商店){
_onPageChanged(){}
返回\u MyPageViewModel(
pageViewList:store.state.pageViewList,
pageController:store.state.pageController,
onPageChanged:_onPageChanged(),
);
}
}
类PageOne扩展了无状态小部件{
第一页();
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:正文(“第一页”),
),
背景颜色:Colors.black,
正文:列(),
抽屉:MyDrawer(),
);
}
}
类PageTwo扩展了无状态小部件{
第二页();
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:正文(“第二页”),
),
背景颜色:Colors.blue,
正文:列(),
抽屉:MyDrawer(),
);
}
}
类MyDrawer扩展了无状态小部件{
MyDrawer({Key}):超级(Key:Key);
@凌驾
小部件构建(构建上下文){
返回存储连接器(
转换器:(存储区)=>\u MyDrawerViewModel.create(存储区),
生成器:(BuildContext上下文,\u MyDrawerViewModel vm){
回程抽屉(
子:ListView(
儿童:[
容器(
孩子:ListTile(
标题:文本(vm.pageOneText),
onTap:vm.pageOneOnTap,
),
),
容器(
孩子:ListTile(
标题:文本(vm.pageTwoText),
onTap:vm.pageTwoOnTap,
),
),
],
),
);
},
);
}
}
类_MyDrawerViewModel{
最后一个字符串pageOneText;
最终字符串pageTwoText;
最终功能pageOneOnTap;
最终功能pageTwoOnTap;
_MyDroperViewModel({
这个.pageOneText,
这个.pageTwoText,
这是pageOneOnTap,
这是pageTwoOnTap,
});
factory\u MyDroperViewModel.create(存储){
_goToPageOne(){
store.dispatch(NavigateToPageOneAction());
}
_戈托帕格沃(){
dispatch(NavigateToPageTwoAction());
}
返回_MyDrawerViewModel(
pageOneText:“第一页”,
pageTwoText:“第二页”,
PAGEONTAP:_goToPageOne,
pageTwoOnTap:_goToPageTwo,
);
}
}

我似乎已经想出了解决问题的办法。我在这篇文章中看到了答案:

在那个岗位上