问题描述
final appState = context.read(appStateProvider);
appState.goToNavBar();
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 (将#修改为@)