Flutter - 每次页面更改时运行一个函数

use*_*745 4 events broadcasting flutter

我想在每次页面更改时运行一个函数Flutter application

理想情况下,我不想在initState每个页面中调用此函数,因为有时人们可能会忘记在新页面中添加调用。

将其视为middleware- 基本上在页面加载之前等,需要运行一些代码。

更新代码以供审核

import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:myapp/pages/login_page.dart';
import 'package:myapp/pages/dashboard_page.dart';
import 'package:myapp/styles/constants.dart';
import 'package:myapp/services/auth_service.dart';

Future<void> main() async {
  // create a auth service instance
  AuthService authService = AuthService(secureStorage: FlutterSecureStorage());
  bool isLoggedIn = await authService.isUserLoggedIn();

  // run the app
  runApp(MyApp(
    isLoggedIn: isLoggedIn,
  ));
}

class MyApp extends StatefulWidget {
  final bool isLoggedIn;

  MyApp({this.isLoggedIn});

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with RouteAware {
  final RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>();

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

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'App NAME',
      theme: ThemeData(
        primarySwatch: Colors.green,
        primaryColor: kPrimeColour,
      ),
      home: widget.isLoggedIn == true ? DashboardPage() : LoginPage(),
      navigatorObservers: [routeObserver],
    );
  }
}

Run Code Online (Sandbox Code Playgroud)

小智 6

你可以使用initState之后调用这个函数的实现方法didChangeDependency,

扑动文档:

子类很少重写此方法,因为框架总是在依赖项更改后调用构建。一些子类确实会重写此方法,因为当它们的依赖项发生变化时,它们需要执行一些昂贵的工作(例如,网络获取),而对于每个构建来说,这些工作都太昂贵了。

关联

    @override
    void didChangeDependencies() {
      super.didChangeDependencies();
      // set your stuff here 
      }
Run Code Online (Sandbox Code Playgroud)