ThemeSetPage.dart 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_habit/common/BaseArchitectural.dart';
  3. import 'package:flutter_habit/common/I18N.dart';
  4. import 'package:flutter_habit/provider/ThemeProvider.dart';
  5. import 'package:provider/provider.dart';
  6. class ThemeSetPage extends StatelessWidget {
  7. @override
  8. Widget build(BuildContext context) {
  9. return MultiProvider(
  10. providers: [
  11. ChangeNotifierProvider<ThemeSetPageService>(
  12. create: (_) => ThemeSetPageService(context)),
  13. ],
  14. child: _ThemeSetPageView(),
  15. );
  16. }
  17. }
  18. // service
  19. class ThemeSetPageService extends BaseProvider {
  20. ThemeSetPageService(BuildContext context) : super(context);
  21. bool isCurrent(BuildContext context, int index) {
  22. return Provider.of<ThemeProvider>(context, listen: false).currentIndex ==
  23. index;
  24. }
  25. void changeThemeTo(BuildContext context, int index) {
  26. Provider.of<ThemeProvider>(context, listen: false).changeTheme(index);
  27. Navigator.of(context).pop();
  28. }
  29. }
  30. // view
  31. class _ThemeSetPageView extends StatelessWidget {
  32. @override
  33. Widget build(BuildContext context) {
  34. ThemeSetPageService service =
  35. Provider.of<ThemeSetPageService>(context, listen: false);
  36. return Scaffold(
  37. appBar: AppBar(
  38. title: Text(I18N.of("主题")),
  39. ),
  40. body: Padding(
  41. padding: EdgeInsets.all(16),
  42. child: ListView.builder(
  43. itemBuilder: (context, index) {
  44. if (index < themeColors.length) {
  45. return ListTile(
  46. leading: service.isCurrent(context, index)
  47. ? Icon(
  48. Icons.radio_button_checked,
  49. color: Theme.of(context).primaryColor,
  50. )
  51. : Icon(Icons.radio_button_unchecked),
  52. title: ElevatedButton(
  53. style: ButtonStyle(
  54. backgroundColor:
  55. MaterialStateProperty.all(themeColors[index]),
  56. ),
  57. onPressed: () => service.changeThemeTo(context, index), child: Text(""),
  58. ),
  59. );
  60. } else if (index == themeColors.length) {
  61. return ListTile(
  62. leading: service.isCurrent(context, index)
  63. ? Icon(
  64. Icons.radio_button_checked,
  65. color: Theme.of(context).primaryColor,
  66. )
  67. : Icon(Icons.radio_button_unchecked),
  68. title: ElevatedButton(
  69. style: ButtonStyle(
  70. backgroundColor: MaterialStateProperty.all(Colors.black),
  71. ),
  72. onPressed: () => service.changeThemeTo(context, index),
  73. child: Text("Btn"),
  74. ),
  75. );
  76. } else {
  77. return null;
  78. }
  79. },
  80. ),
  81. ),
  82. );
  83. }
  84. }