gpt4 book ai didi

redux - Flutter Redux Navigator GlobalKey.currentState 返回 null

转载 作者:IT王子 更新时间:2023-10-29 06:35:45 25 4
gpt4 key购买 nike

我正在使用 Redux 开发 Flutter。

当用户启动一个应用程序时,我希望 Redux 自动调度一个action。此操作将使 Navigator 依赖地推送不同的路由。

这段代码 provided by a Flutter dev member使用 GlobalKey 来使用 middleware 中的 Navigator

在此之后,我将我的代码组织如下:

ma​​in.dart

void main() {
final store = new Store(appStateReducer,
middleware:createRouteMiddleware()
);
runApp(new MyApp(store));
}

class MyApp extends StatelessWidget {
final Store<AppState> store;

MyApp(this.store);

@override
Widget build(BuildContext context) {
return new StoreProvider<AppState>(
store: store,
child: MaterialApp(
routes: {
Routes.REGISTER: (context) {
return RegisterScreenContainer();
},
Routes.SET_PROFILE: (context) {
return SetProfileScreenContainer();
},
//Routes.HOME = "/" so this route will be run first
Routes.HOME: (context) {
return StoreBuilder<AppState>(
//onInit is called to dispatch an action automatically when the application starts. The middleware will catch this and navigate to the appropriate route.
onInit: (store) => store.dispatch(
ChangeRoute(routeStateType: RouteStateType.Register)),
builder: (BuildContext context, Store vm) {
return RegisterScreenContainer();
},
);
},
}));
}
}

middleware.dart

Middleware<AppState> createRouteMiddleware(
{@required GlobalKey<NavigatorState> navigatorKey}) {
final changeRoute = _createChangeRouteMiddleware(navigatorKey: navigatorKey);
return TypedMiddleware<AppState, ChangeRoute>(changeRoute);
}

Middleware<AppState> _createChangeRouteMiddleware(
{@required GlobalKey<NavigatorState> navigatorKey}) {
print(navigatorKey.currentState);
return (Store store, action, NextDispatcher next) async {
switch ((action.routeStateType as RouteStateType)) {
case RouteStateType.Home:
navigatorKey.currentState.pushNamed(Routes.HOME);
break;
case RouteStateType.Register:
//The middleware intercepts and push the appropriate route depending on the action
navigatorKey.currentState.pushNamed(Routes.REGISTER);
break;
default:
break;
}
next(action);
};
}

这是我得到的错误

[错误:topaz/lib/tonic/logging/dart_error.cc(16)] 未处理的异常:
E/flutter ( 2544 ): NoSuchMethodError: 方法 'pushNamed' 被调用为 null。
E/flutter ​​(2544):接收器:空
E/flutter ( 2544): 尝试调用:pushNamed("/register")

这意味着 action 已成功派发,但是 navigatorKeycurrentStatenull

我在这里错过了什么?

请注意,我知道 this seemingly similar question这并不真正适用于我的问题。即使我将 ma​​in.dartmiddleware.dart 合并到一个文件中,它仍然不起作用。

最佳答案

我通过将全局导航键放在一个单独的文件中解决了这个问题。然后我在我的 materialApp 和中间件中使用了它。

我将导航键放在我的 keys.dart 文件中:

import 'package:flutter/widgets.dart';
class NoomiKeys {
static final navKey = new GlobalKey<NavigatorState>();
}

在我的 main.dart 文件中添加了 MaterialApp 小部件“navigatorKey:NoomiKeys.navKey”的键(删除了大量代码以使其更快阅读):

import 'package:noomi_nursing_home_app/keys.dart';


@override
Widget build(BuildContext context) {
return StoreProvider<AppState>(
store: store,
child: MaterialApp(

//Add the key to your materialApp widget
navigatorKey: NoomiKeys.navKey,

localizationsDelegates: [NoomiLocalizationsDelegate()],
onGenerateRoute: (RouteSettings settings) {
switch (settings.name) {

并在navigate_middleware.dart中使用它;

import 'package:noomi_nursing_home_app/actions/actions.dart';
import 'package:noomi_nursing_home_app/keys.dart';
import 'package:redux/redux.dart';
import 'package:noomi_nursing_home_app/models/models.dart';

List<Middleware<AppState>> navigateMiddleware() {

final navigatorKey = NoomiKeys.navKey;

final navigatePushNamed = _navigatePushNamed(navigatorKey);
return ([
TypedMiddleware<AppState, NavigatePushNamedAction>(navigatePushNamed),
]);
}

Middleware<AppState> _navigatePushNamed(navigatorKey) {
return (Store<AppState> store, action, NextDispatcher next) {
next(action);
navigatorKey.currentState.pushNamed(action.to);
};
}

关于redux - Flutter Redux Navigator GlobalKey.currentState 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50303441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com