如何存储MaterialPageRoute以供以后使用

问题描述 投票:0回答:1

我有一个移动应用程序,我想记录应用程序中每个页面的访问次数,然后加载用户访问最多的页面。我有一个

RouteObserver
观察哪条路线被推入视图中。我想知道是否可以将
MaterialPageRoute
的状态保存到某个数据库中,然后稍后将其传递到
Navigator
中。我应该如何处理这个问题?

flutter dart flutter-navigation
1个回答
0
投票

您可以使用共享shared_preferences来存储访问计数,并使用RouteObserver来跟踪页面

class PageTracker extends RouteObserver<PageRoute<dynamic>> {
  final SharedPreferences prefs;

  PageTracker(this.prefs);

  @override
  void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
    super.didPush(route, previousRoute);
    if (route is PageRoute) {
      _incrementPageVisit(route.settings.name ?? '');
    }
  }

  void _incrementPageVisit(String routeName) {
    Map<String, int> visits = _getVisits();
    visits[routeName] = (visits[routeName] ?? 0) + 1;
    prefs.setString('page_visits', jsonEncode(visits));
  }

  Map<String, int> _getVisits() {
    String visitsJson = prefs.getString('page_visits') ?? '{}';
    return Map<String, int>.from(jsonDecode(visitsJson));
  }

  Future<String?> getMostVisitedPage() async {
    Map<String, int> visits = _getVisits();
    if (visits.isEmpty) return null;
    return visits.entries.reduce((a, b) => a.value > b.value ? a : b).key;
  }
}

// Usage in your app
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final prefs = await SharedPreferences.getInstance();
  final pageTracker = PageTracker(prefs);

  runApp(MaterialApp(
    navigatorObservers: [pageTracker],
    home: HomePage(pageTracker: pageTracker),
  ));
}

class HomePage extends StatelessWidget {
  final PageTracker pageTracker;

  HomePage({required this.pageTracker});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Home')),
      body: Center(
        child: ElevatedButton(
          child: Text('Go to Most Visited Page'),
          onPressed: () async {
            String? mostVisitedPage = await pageTracker.getMostVisitedPage();
            if (mostVisitedPage != null) {
              Navigator.of(context).pushNamed(mostVisitedPage);
            }
          },
        ),
      ),
    );
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.