import 'dart:async'; import 'dart:io'; import 'package:fl_clash/clash/clash.dart'; import 'package:fl_clash/common/common.dart'; import 'package:fl_clash/models/common.dart'; import 'package:fl_clash/state.dart'; import 'package:fl_clash/widgets/widgets.dart'; import 'package:flutter/material.dart'; final _memoryInfoStateNotifier = ValueNotifier( TrafficValue(value: 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(); } _updateMemory() async { WidgetsBinding.instance.addPostFrameCallback((_) async { final rss = ProcessInfo.currentRss; _memoryInfoStateNotifier.value = TrafficValue( value: clashLib != null ? rss : await clashCore.getMemory() + 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: () { clashCore.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: _memoryInfoStateNotifier, builder: (_, trafficValue, __) { return Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Text( trafficValue.showValue, style: context.textTheme.bodyMedium?.toLight .adjustSize(1), ), SizedBox( width: 8, ), Text( trafficValue.showUnit, style: context.textTheme.bodyMedium?.toLight .adjustSize(1), ) ], ); }, ), ) ], ), ), ), ); } } // class AnimatedCounter extends StatefulWidget { // final double value; // final TextStyle? style; // // const AnimatedCounter({ // super.key, // required this.value, // this.style, // }); // // @override // State createState() => _AnimatedCounterState(); // } // // class _AnimatedCounterState extends State { // late double _previousValue; // late double _currentValue; // // @override // void initState() { // super.initState(); // _previousValue = widget.value; // _currentValue = widget.value; // } // // @override // void didUpdateWidget(AnimatedCounter oldWidget) { // super.didUpdateWidget(oldWidget); // if (oldWidget.value != widget.value) { // // if (_previousValue == _currentValue) { // // _previousValue = widget.value; // // _currentValue = widget.value; // // return; // // } // _currentValue = widget.value; // } // } // // @override // void dispose() { // super.dispose(); // } // // @override // Widget build(BuildContext context) { // return Text( // _currentValue.fixed(decimals: 1), // style: widget.style, // ); // return TweenAnimationBuilder( // tween: Tween( // begin: _previousValue, // end: _currentValue, // ), // onEnd: () { // _previousValue = _currentValue; // }, // duration: Duration(seconds: 6), // curve: Curves.easeOut, // builder: (_, value, ___) { // return Text( // value.fixed(decimals: 1), // style: widget.style, // ); // }, // ); // } // }