【问题标题】:Flutter: RouteAware triggers only didPush eventFlutter:RouteAware 仅触发 didPush 事件
【发布时间】:2021-02-25 17:33:47
【问题描述】:

您好,我是 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() 事件,但它不会触发。我在这里想念什么?我的主要问题是我想在用户退出配置文件屏幕但在进入另一个屏幕的初始化之前保存更改。

【问题讨论】:

    标签: flutter flutter-routes


    【解决方案1】:

    我遇到了类似的问题,所以如果这可以帮助任何人,这就是造成它的原因。问题是RouteAware 订阅的RouteObserverMaterialApp 使用的不同。

    所以MaterialApp 中的RouteObserver 正在检查didPushdidPop 事件,但没有任何侦听器。您仍然收到didPush 事件的原因是,当您subscribe 时,观察者总是发送didPush

    在我们的案例中,根本原因是我们使用 ProviderRouteObserver 提供给 RouteAware 小部件,但每次重建 MaterialApp 时,它都会得到一个新的 RouteObserver,而不是由提供者创建。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多