gpt4 book ai didi

使用 BLoC : The context used to push routes from the Navigator must be a descendant of a Navigator widget 的 Flutter 导航

转载 作者:IT王子 更新时间:2023-10-29 06:51:13 27 4
gpt4 key购买 nike

我正在使用 BLoC,我需要从 PageOne 导航到 PageTwo 并能够使用后退按钮返回,我不知道这是否是处理此问题的正确方法。当函数 _navigateToPage2 被调用时,我也遇到了错误。

The context used to push or pop routes from the Navigator must be that of a widget that is a descendant of a Navigator widget.

class SimpleBlocDelegate extends BlocDelegate {

@override
void onTransition(Transition transition) {
print(transition);
}

@override
void onError(Object error, StackTrace stacktrace) {
print(error);
}
}



void main() {
BlocSupervisor().delegate = SimpleBlocDelegate();
runApp(MyApp(userRepository: UserRepository(GuriApi())));
}

class MyApp extends StatefulWidget {
final UserRepository userRepository;

MyApp({Key key, @required this.userRepository}) : super(key: key);

@override
State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
AuthenticationBloc _authenticationBloc;
UserRepository get _userRepository => widget.userRepository;

@override
void initState() {
_authenticationBloc = AuthenticationBloc(userRepository: _userRepository);
_authenticationBloc.dispatch(AppStarted());
super.initState();
}

@override
void dispose() {
_authenticationBloc.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
return BlocProvider<AuthenticationBloc>(
bloc: _authenticationBloc,
child: MaterialApp(
theme: new ThemeData(
fontFamily: 'Monserrat',
primaryColor: Colors.lightBlue[50],
accentColor: Colors.white),
home: BlocBuilder<AuthenticationEvent, AuthenticationState>(
bloc: _authenticationBloc,
builder: (BuildContext context, AuthenticationState state) {
if (state is AuthenticationUninitialized) {
return SplashPage();
}
if (state is AuthenticationAuthenticated) {
return Home(userRepository: _userRepository);
}
if (state is AuthenticationUnauthenticated) {
return LoginPage(userRepository: _userRepository);
}
if (state is AuthenticationLoading) {
return LoadingIndicator();
}
if (state is PageOneSelected) {
return PageOne();
}
if (state is PageTwoSelected) {
_navigateToPage2();
}
},
),
),
);
}

_navigateToPage2() {
Navigator.of(context).push<bool>(
MaterialPageRoute(
builder: (BuildContext context) =>
PageTwo(userRepository: _userRepository)));
}
}

最佳答案

我认为通过订阅 initState 中的 bloc 状态变化来处理导航会更好:

@override
void initState() {
super.initState();

bloc.state.listen((state) {
if (state is PageOneSelected) {
_navigateToPage2();
} else if (state is PageTwoSelected) {
_navigateToPage2();
}
});
}

在构建方法中显示一些其他小部件。您的代码中发生错误,因为 blocBuilder 必须返回 Widget 但在 PageTwoSelected 状态的情况下,您什么也不返回。

关于使用 BLoC : The context used to push routes from the Navigator must be a descendant of a Navigator widget 的 Flutter 导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54752882/

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