当我从提供程序调用函数时,Navigation 2.0 没有路由

问题描述

final appState = context.read(appStateProvider);
      appState.goToNavBar();

这是AppState调用的PageAction的代码

class PageAction {
  PageState state;
  PageConfiguration? page;
  List<PageConfiguration>? pages;
  Widget? widget;

  PageAction({this.state = PageState.none,this.page,this.pages,this.widget});
}

这是来自 AppState 类的代码,它是一个 ChangeNotifier,应该被调用以进行导航。

PageAction _currentAction = PageAction();
  PageAction get currentAction => _currentAction;
  set currentAction(PageAction action) {
    _currentAction = action;
    notifyListeners();
  }
void goToNavBar() {
    _currentAction =
        PageAction(state: PageState.addPage,page: navBarPageConfig);
    notifyListeners();
  }

每当我运行运行该代码函数时,什么都没有发生。如果我在那里放了一个打印但没有视觉变化,它会打印出来。

重现步骤

预期结果: 我希望它导航到 NavBar 页面

实际结果: 完全没有视觉变化。

这是 AppRouter 类,它应该处理路由,但目前除了推送我的初始路由之外没有工作,我希望它在检查用户后只使用 isUserLoggedIn() 来设置路由。


class AppRouterDelegate extends RouterDelegate<PageConfiguration>
    with ChangeNotifier,PopNavigatorRouterDelegateMixin<PageConfiguration> {
  final List<MaterialPage> _pages = [];
  late AppBackButtondispatcher backButtondispatcher;

  @override
  final GlobalKey<NavigatorState> navigatorKey;
  final AppState appState;

  AppRouterDelegate(this.appState) : navigatorKey = GlobalKey() {
    appState.addListener(() {
      notifyListeners();
    });
  }

  /// Getter for a list that cannot be changed
  List<MaterialPage> get pages => List.unmodifiable(_pages);

  /// Number of pages function
  int numPages() => _pages.length;

  @override
  PageConfiguration get currentConfiguration =>
      _pages.last.arguments as PageConfiguration;

  @override
  Widget build(BuildContext context) {
    return Navigator(
      key: navigatorKey,onPopPage: _onPopPage,pages: buildPages(),);
  }

  bool _onPopPage(Route<dynamic> route,result) {
    final didPop = route.didPop(result);
    if (!didPop) {
      return false;
    }
    if (canPop()) {
      pop();
      return true;
    } else {
      return false;
    }
  }

  void pop() {
    if (canPop()) {
      _removePage(_pages.last);
    }
  }

  void _removePage(MaterialPage? page) {
    if (page != null) {
      _pages.remove(page);
    }
  }

  bool canPop() {
    return _pages.length > 1;
  }

  MaterialPage _createPage(Widget child,PageConfiguration pageConfig) {
    return MaterialPage(
        child: child,key: ValueKey(pageConfig.key),name: pageConfig.path,arguments: pageConfig);
  }

  void replace(PageConfiguration newRoute) {
    if (_pages.isNotEmpty) {
      _pages.removeLast();
    }
    addPage(newRoute);
  }

  void setPath(List<MaterialPage> path) {
    _pages.clear();
    _pages.addAll(path);
  }

  void replaceAll(PageConfiguration newRoute) {
    setNewRoutePath(newRoute);
  }

  void push(PageConfiguration newRoute) {
    addPage(newRoute);
  }

  void addAll(List<PageConfiguration> routes) {
    _pages.clear();
    routes.forEach((route) {
      addPage(route);
    });
  }

  Future<void> isUserLoggedIn() async {
    ParseUser? currentUser = await ParseUser.currentUser() as ParseUser?;
    if (currentUser == null) {
      setNewRoutePath(loginPageConfig);
    }
    //Checks whether the user's session token is valid
    final ParseResponse parseResponse =
        (await ParseUser.getCurrentUserFromServer(
            currentUser!.get<String>('sessionToken')!))!;

    if (!parseResponse.success) {
      //Invalid session. logout
      await currentUser.logout();
      setNewRoutePath(loginPageConfig);
    } else {
      setNewRoutePath(navBarPageConfig);
    }
  }

  @override
  Future<void> setNewRoutePath(PageConfiguration configuration) {
    final shouldAddPage = _pages.isEmpty ||
        (_pages.last.arguments as PageConfiguration).uiPage !=
            configuration.uiPage;
    if (shouldAddPage) {
      _pages.clear();
      addPage(configuration);
    }
    return SynchronousFuture(null);
  }

  void addPage(PageConfiguration pageConfig) {
    final shouldAddPage = _pages.isEmpty ||
        (_pages.last.arguments as PageConfiguration).uiPage !=
            pageConfig.uiPage;
    if (shouldAddPage) {
      switch (pageConfig.uiPage) {
        case Pages.Home:
          _pages.add(
            _createPage(InitialPage(),pageConfig),);
          break;
        case Pages.NavBar:
          _pages.add(
            _createPage(MyBottomNavBar(),);
          break;
        case Pages.Login:
          _pages.add(
            _createPage(LoginPage(),);
          break;
        default:
          break;
      }
    }
  }

  void _setPageAction(PageAction action) {
    switch (action.page!.uiPage) {
      case Pages.Home:
        homePageConfig.currentPageAction = action;
        break;
      case Pages.NavBar:
        navBarPageConfig.currentPageAction = action;
        break;
      case Pages.Login:
        loginPageConfig.currentPageAction = action;
        break;
      default:
        break;
    }
  }

  List<Page> buildPages() {
    switch (appState.currentAction.state) {
      case PageState.none:
        break;
      case PageState.addPage:
        _setPageAction(appState.currentAction);
        addPage(appState.currentAction.page as PageConfiguration);
        break;
      case PageState.replace:
        _setPageAction(appState.currentAction);
        replace(appState.currentAction.page as PageConfiguration);
        break;
      case PageState.replaceAll:
        _setPageAction(appState.currentAction);
        replaceAll(appState.currentAction.page as PageConfiguration);
        break;
      case PageState.addAll:
        addAll(appState.currentAction.pages as List<PageConfiguration>);
        break;
      default:
        break;
    }
    appState.resetCurrentAction();
    return List.of(_pages);
  }

  void parseRoute(Uri uri) {
    if (uri.pathSegments.isEmpty) {
      setNewRoutePath(homePageConfig);
      return;
    }
    if (uri.pathSegments.length == 1) {
      final path = uri.pathSegments[0];
      switch (path) {
        case 'home':
          replaceAll(homePageConfig);
          break;
        case 'navbar':
          replace(navBarPageConfig);
          break;
        case 'login':
          replace(loginPageConfig);
          break;
      }
    }
  }
}

这是页面配置

const String HomePath = '/home';
const String RegisterSuccesspath = '/register-success';
const String NavBarPath = '/nav';
const String LoginPath = '/login';
enum Pages { Home,RegisterSuccess,NavBar,Login }

class PageConfiguration {
  final String key;
  final String path;
  final Pages uiPage;
  PageAction? currentPageAction;
  var extras;

  PageConfiguration(
      {required this.key,required this.path,required this.uiPage,this.currentPageAction});
}

PageConfiguration homePageConfig = PageConfiguration(
    key: 'Home',path: HomePath,uiPage: Pages.Home,currentPageAction: null);
PageConfiguration loginPageConfig = PageConfiguration(
    key: 'Login',path: LoginPath,uiPage: Pages.Login,currentPageAction: null);
PageConfiguration navBarPageConfig = PageConfiguration(
    key: 'NavBar',path: NavBarPath,uiPage: Pages.NavBar,currentPageAction: null);

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)