Optimize provider page

Optimize delay test

Support local backup and recovery
This commit is contained in:
chen08209
2024-08-04 08:21:14 +08:00
parent 6cfcaa4edc
commit bee2f8aa4f
53 changed files with 1993 additions and 1128 deletions

View File

@@ -23,24 +23,19 @@ class AccessFragment extends StatefulWidget {
}
class _AccessFragmentState extends State<AccessFragment> {
final packagesListenable = ValueNotifier<List<Package>>([]);
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
Future.delayed(const Duration(milliseconds: 300), () async {
packagesListenable.value = await app?.getPackages() ?? [];
});
final appState = globalState.appController.appState;
if (appState.packages.isEmpty) {
Future.delayed(const Duration(milliseconds: 300), () async {
appState.packages = await app?.getPackages() ?? [];
});
}
});
}
@override
void dispose() {
super.dispose();
packagesListenable.dispose();
}
Widget _buildAppProxyModePopup() {
final items = [
CommonPopupMenuItem(
@@ -156,8 +151,8 @@ class _AccessFragmentState extends State<AccessFragment> {
// }
Widget _buildPackageList() {
return ValueListenableBuilder(
valueListenable: packagesListenable,
return Selector<AppState, List<Package>>(
selector: (_, appState) => appState.packages,
builder: (_, packages, ___) {
final accessControl = globalState.appController.config.accessControl;
final acceptList = accessControl.acceptList;
@@ -238,10 +233,10 @@ class _AccessFragmentState extends State<AccessFragment> {
.textTheme
.labelLarge
?.copyWith(
color: Theme.of(context)
.colorScheme
.primary,
),
color: Theme.of(context)
.colorScheme
.primary,
),
),
),
const Flexible(
@@ -256,10 +251,10 @@ class _AccessFragmentState extends State<AccessFragment> {
.textTheme
.labelLarge
?.copyWith(
color: Theme.of(context)
.colorScheme
.primary,
),
color: Theme.of(context)
.colorScheme
.primary,
),
),
),
],
@@ -288,47 +283,43 @@ class _AccessFragmentState extends State<AccessFragment> {
),
Expanded(
flex: 1,
child: FadeBox(
key: const Key("fade_box"),
child: currentPackages.isEmpty
? const Center(
child: CircularProgressIndicator(),
)
: ListView.builder(
itemCount: currentPackages.length,
itemBuilder: (_, index) {
final package = currentPackages[index];
return PackageListItem(
key: Key(package.packageName),
package: package,
value:
valueList.contains(package.packageName),
isActive: isAccessControl,
onChanged: (value) {
if (value == true) {
valueList.add(package.packageName);
} else {
valueList.remove(package.packageName);
}
final config =
globalState.appController.config;
if (accessControlMode ==
AccessControlMode.acceptSelected) {
config.accessControl =
config.accessControl.copyWith(
child: currentPackages.isEmpty
? const Center(
child: CircularProgressIndicator(),
)
: ListView.builder(
itemCount: currentPackages.length,
itemBuilder: (_, index) {
final package = currentPackages[index];
return PackageListItem(
key: Key(package.packageName),
package: package,
value: valueList.contains(package.packageName),
isActive: isAccessControl,
onChanged: (value) {
if (value == true) {
valueList.add(package.packageName);
} else {
valueList.remove(package.packageName);
}
final config =
globalState.appController.config;
if (accessControlMode ==
AccessControlMode.acceptSelected) {
config.accessControl =
config.accessControl.copyWith(
acceptList: valueList,
);
} else {
config.accessControl =
config.accessControl.copyWith(
} else {
config.accessControl =
config.accessControl.copyWith(
rejectList: valueList,
);
}
}
},
);
},
);
},
),
),
),
),
],
),