Flutter - run a function every time the page changes

◇◆丶佛笑我妖孽 提交于 2021-01-21 10:45:30

问题


I want to run a function every time the page changes in my Flutter application.

Ideally, I don't want to call this function in initState of every page, as sometimes people can forget to add the call in a new page.

Think of it as middleware - be basically before the page loads etc, some code needs to run.

Updated code for review

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],
    );
  }
}


回答1:


You can use inheritance

abstract class MyState<T extends StatefulWidget> extends State {
  @override
  void initState() {
    super.initState();
    //YOUR CHANGE PAGE METHOD HERE
  }
}

class YellowBird extends StatefulWidget {
  const YellowBird({ Key key }) : super(key: key);

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

class _YellowBirdState extends MyState<YellowBird> {
  @override
  Widget build(BuildContext context) {
    return Container(color: const Color(0xFFFFE306));
  }
}



回答2:


You can use implementation method didChangeDependencies this function called after initState,

flutter doc :

Subclasses rarely override this method because the framework always calls build after a dependency changes. Some subclasses do override this method because they need to do some expensive work (e.g., network fetches) when their dependencies change, and that work would be too expensive to do for every build.

Link

    @override
    void didChangeDependencies() {
      super.didChangeDependencies();
      // set your stuff here 
      }


来源:https://stackoverflow.com/questions/57307050/flutter-run-a-function-every-time-the-page-changes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!