settings.dart 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import 'package:flutter/widgets.dart';
  2. import 'package:flutter/material.dart' show Icons, ListTile, Material;
  3. import 'package:flutter/cupertino.dart' show CupertinoIcons;
  4. import '../l10n/app_localizations.dart';
  5. import '../ui/adaptive.dart' show AppScaffold, isPlatformAndroid;
  6. import '../helper/url.dart' show launchURL;
  7. import 'package:package_info_plus/package_info_plus.dart' show PackageInfo;
  8. import '../config/routes.dart';
  9. import '../l10n/constants.dart';
  10. /// Settings page.
  11. class SettingsPage extends StatelessWidget {
  12. const SettingsPage({super.key});
  13. @override
  14. Widget build(BuildContext context) {
  15. return AppScaffold(
  16. title: Text(AppLocalizations.of(context)!.settingsTitle),
  17. body: Column(
  18. children: <Widget>[
  19. // App Info
  20. Padding(
  21. padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 15),
  22. child: Row(
  23. mainAxisAlignment: MainAxisAlignment.center,
  24. children: <Widget>[
  25. // App image
  26. Container(
  27. height: 125,
  28. width: 150,
  29. padding: const EdgeInsets.symmetric(horizontal: 10),
  30. child: const DecoratedBox(
  31. decoration: BoxDecoration(
  32. image: DecorationImage(
  33. image: AssetImage('graphics/icon.png'),
  34. ),
  35. ),
  36. ),
  37. ),
  38. SizedBox(
  39. width: 160,
  40. child: Column(
  41. crossAxisAlignment: CrossAxisAlignment.start,
  42. children: <Widget>[
  43. // Name
  44. Padding(
  45. padding: const EdgeInsets.symmetric(vertical: 7),
  46. child: Text(AppLocalizations.of(context)!.appName,
  47. style: const TextStyle(fontSize: 25))),
  48. // Version of app
  49. FutureBuilder(
  50. future: PackageInfo.fromPlatform(),
  51. builder: (BuildContext context,
  52. AsyncSnapshot<PackageInfo> snapshot) {
  53. if (snapshot.hasData) {
  54. return Text(snapshot.data!.version,
  55. style: const TextStyle(fontSize: 14));
  56. }
  57. return Text(AppLocalizations.of(context)!.loading);
  58. },
  59. ),
  60. ],
  61. ),
  62. )
  63. ],
  64. ),
  65. ),
  66. const SizedBox(height: 5),
  67. // List of options
  68. Expanded(
  69. child: Material(
  70. child: ListView(
  71. physics: const NeverScrollableScrollPhysics(),
  72. children: [
  73. // Source
  74. ListTile(
  75. dense: true,
  76. leading: const Icon(Icons.code),
  77. title: Text(AppLocalizations.of(context)!.source,
  78. style: const TextStyle(fontSize: 15)),
  79. onTap: () {
  80. launchURL(Constants.repoUrl);
  81. },
  82. ),
  83. // Acknowledgements
  84. ListTile(
  85. dense: true,
  86. leading: isPlatformAndroid()
  87. ? const Icon(Icons.book)
  88. : const Icon(CupertinoIcons.book),
  89. title: Text(AppLocalizations.of(context)!.licenses,
  90. style: const TextStyle(fontSize: 15)),
  91. onTap: () {
  92. Navigator.of(context)
  93. .pushNamed(AppRoutes.settingAcknowledgements);
  94. },
  95. ),
  96. ],
  97. ),
  98. ),
  99. ),
  100. ],
  101. ),
  102. );
  103. }
  104. }