0

您好,我是 Flutter 的新手,虽然我已经搜索过这个主题,但我不清楚。所以这里是代码:

main.dart 文件

RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>();
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await DotEnv().load('.env');
  final UserRepository userRepository = new UserRepository();
  runApp(BlocProvider(
    create: (context) => AuthenticationBloc(userRepository)..add(AppStarted()),
    child: App(
      userRepository: userRepository
    ),
  ));
}

profile_form.dart(在另一个文件上,从 main.dart 导入 routeObserver)

class ProfileForm extends StatefulWidget {
  final UserRepository _userRepository;
  final User _user;

  ProfileForm(
      {Key key, @required UserRepository userRepository, @required User user})
      : assert(userRepository != null && user != null),
        _userRepository = userRepository,
        _user = user,
        super(key: key);
  State<ProfileForm> createState() => _ProfileFormState();
}

class _ProfileFormState extends State<ProfileForm> with RouteAware {

  UserRepository get _userRepository => widget._userRepository;
  User get _user => widget._user;

  

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

  @override
  void didChangeDependencies() {
    routeObserver.subscribe(this, ModalRoute.of(context));
    super.didChangeDependencies();
  }

  @override
  void didPush() {
    print('didPush FirstPage');
  }

  @override
  void didPopNext() {
    print('didPopNext FirstPage');
  }

  @override
  void didPop() {
    print('didPop FirstPage');
  }

  @override
  void didPushNext() {
    print('didPushNext FirstPage');
  }

  @override
  void dispose() {
    print("dis");
    routeObserver.unsubscribe(this);
    super.dispose();
  }
}

这个表单是通过 Navigator.pushReplacementNamed(context, '/profile'); 输入的。虽然当我返回另一个页面(再次从 Nanigator 或后退按钮)并等待 didPop() 事件触发时触发了 didPush() 事件,但它不会触发。我在这里想念什么?我的主要问题是我想在用户退出配置文件屏幕但在进入另一个屏幕的初始化之前保存更改。

4

1 回答 1

0

我有一个类似的问题,所以如果这可以帮助任何人,这就是造成它的原因。问题是RouteObserver订阅RouteAware的 与 使用的不同MaterialApp

所以RouteObserverinMaterialApp正在检查didPush&didPop事件,但没有任何听众。您仍然收到didPush事件的原因是,观察者总是didPush在您发送一个事件subscribe

在我们的案例中,根本原因是我们使用 aProvider向小部件提供RouteObserverRouteAware但每次MaterialApp重建时,它都会RouteObserver与提供者创建的不同。

检查RouteObserver您正在订阅的是否与正在使用的相同MaterialApp,使用hashCode属性!

于 2021-07-27T13:36:32.193 回答