[英]Flutter - Cubit & Navigation 2.0: emitting new page from page
我正在嘗試使用 Navigation 2.0 和 BLoC 模式創建一個帶有 Flutter 的網站。 為此,我閱讀了以下指南:
但是我面臨一個問題,我試圖從我的網站顯示頁面之一推送新頁面:新頁面永遠不會顯示!
要了解:
MainNavigationCubit
。 這肘的 state(意思是頁)保存在NavigationStack
中。MainNavigationCubit
負責在我的自定義RouterDelegate
中構建Navigator
(參見下面的代碼)。 因此,在state 更改后,它會使用正確的頁面列表重建Navigator
。問題背景:
book id
。MainNavigationCubit
推送“404 not found page”。例如,如果用戶手動將正確的 URL 輸入到書頁但 ID 無效,則可能會發生這種情況。
然而,盡管MainNavigationCubit
正確地發出帶有相關頁面的新NavigationStack
,但從未顯示“404 未找到頁面”。
這是我的自定義RouterDelegate
中的代碼:
@override
GlobalKey<NavigatorState> get navigatorKey => GlobalKey<NavigatorState>(debugLabel: 'main_navigation_key');
@override
Future<void> setNewRoutePath(PageConfig configuration) {
if (configuration.route != homeRoute) {
mainNavigationCubit.push(configuration.route, configuration.args);
} else {
mainNavigationCubit.clearToHome();
}
return SynchronousFuture(null);
}
@override
Widget build(BuildContext context) {
return BlocBuilder<MainNavigationCubit, NavigationStack>(
builder: (context, stack) {
return Navigator(
pages: stack.pages,
key: navigatorKey,
onPopPage: (route, result) => _onPopPage.call(route, result),
);
},
);
@override
PageConfig get currentConfiguration => mainNavigationCubit.state.last;
bool _onPopPage(Route<dynamic> route, dynamic result) {
final didPop = route.didPop(result);
if (!didPop) {
return false;
}
if (mainNavigationCubit.canPop()) {
mainNavigationCubit.pop();
return true;
} else {
return false;
}
}
這是我的“Book”StatelessWidget 頁面中的代碼:
@override
Widget build(BuildContext context) {
if (bookId == -1) {
context.read<MainNavigationCubit>().showNotFound(); // let's assume this will be properly handled when I'll be creating this page's BLoC.
}
return // full book details UI;
}
以防萬一MainNavigationCubit.showNotFound()
的代碼:
void showNotFound() {
clearAndPush(notFound);
}
void clearAndPush(String path, [Map<String, dynamic>? args]) {
final PageConfig pageConfig = PageConfig(location: path, args: args);
emit(state.clearAndPush(pageConfig));
}
好的,經過大量調查,我找到了問題的原因。
正如文檔所說:在發出等於當前 state 的新 state 時,Cubit 不會通知聽眾。
就我而言,我的MainNavigationCubit
的 state 是我從本指南中獲取的NavigationStack
: https://medium.com/@JalalOkbi/flutter-navigator-2-0-with-bloc-the-ultadimate-guide-6
查看代碼, NavigationStack
公開了改變內部頁面列表的方法。
問題是這個列表屬於當前的 state ,因此修改它意味着也修改當前的 state。
由於當前和新的 state 都依賴於相同的確切列表,因此 Cubit 不會發出新的 state。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.