import 'dart:async'; import 'dart:io'; import 'package:fl_clash/common/common.dart'; import 'package:fl_clash/core/controller.dart'; import 'package:fl_clash/state.dart'; import 'package:fl_clash/widgets/widgets.dart'; import 'package:flutter/material.dart'; final _memoryStateNotifier = ValueNotifier(0); class MemoryInfo extends StatefulWidget { const MemoryInfo({super.key}); @override State createState() => _MemoryInfoState(); } class _MemoryInfoState extends State { Timer? timer; @override void initState() { super.initState(); _updateMemory(); } @override void dispose() { timer?.cancel(); super.dispose(); } Future _updateMemory() async { WidgetsBinding.instance.addPostFrameCallback((_) async { final rss = ProcessInfo.currentRss; if (coreController.isCompleted) { _memoryStateNotifier.value = await coreController.getMemory() + rss; } else { _memoryStateNotifier.value = rss; } timer = Timer(Duration(seconds: 2), () async { _updateMemory(); }); }); } @override Widget build(BuildContext context) { return SizedBox( height: getWidgetHeight(1), child: CommonCard( info: Info(iconData: Icons.memory, label: appLocalizations.memoryInfo), onPressed: () { coreController.requestGc(); }, child: Container( padding: baseInfoEdgeInsets.copyWith(top: 0), child: Column( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( height: globalState.measure.bodyMediumHeight + 2, child: ValueListenableBuilder( valueListenable: _memoryStateNotifier, builder: (_, memory, _) { final traffic = memory.traffic; return Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Text( traffic.value, style: context.textTheme.bodyMedium?.toLight .adjustSize(1), ), SizedBox(width: 8), Text( traffic.unit, style: context.textTheme.bodyMedium?.toLight .adjustSize(1), ), ], ); }, ), ), ], ), ), ), ); } }