Flutter plugin for scanning and generating QR codes using the ZXing library, supporting Android, iOS, and desktop platforms
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
3.5 KiB

import 'package:flex_color_scheme/flex_color_scheme.dart';
import 'package:flutter/material.dart';
import '../configs/app_store.dart';
// The width size of the scrolling button.
const double _kWidthOfScrollItem = 71.6;
// Horizontal theme selector of themes offered in our [AppColor.schemes].
//
// This example uses a StatefulWidget for the scroll controller and
// index to keep track of previously selected color scheme, so we can animate
// to the new selection, also done when the themeController schemeIndex is
// changed via other UI controls, like in the drop box that is also used in
// this demo as another way to change the color scheme.
//
// The theme is controlled via the passed in ThemeController.
class ThemeSelector extends StatefulWidget {
const ThemeSelector({
super.key,
});
@override
State<ThemeSelector> createState() => _ThemeSelectorState();
}
class _ThemeSelectorState extends State<ThemeSelector> {
late ScrollController scrollController;
late int schemeIndex;
@override
void initState() {
super.initState();
schemeIndex = appStore.colorSchemeIndex;
scrollController = ScrollController(
initialScrollOffset: _kWidthOfScrollItem * schemeIndex,
);
}
@override
void dispose() {
scrollController.dispose();
super.dispose();
}
@override
void didChangeDependencies() {
// Index got updated in popup and deps changed, animate it to new index.
if (appStore.colorSchemeIndex != schemeIndex) {
schemeIndex = appStore.colorSchemeIndex;
scrollController.animateTo(_kWidthOfScrollItem * schemeIndex,
duration: const Duration(milliseconds: 350),
curve: Curves.easeOutCubic);
}
super.didChangeDependencies();
}
@override
Widget build(BuildContext context) {
final bool isLight = Theme.of(context).brightness == Brightness.light;
return SizedBox(
height: 76,
child: Row(
children: <Widget>[
Expanded(
child: ListView.builder(
controller: scrollController,
physics: const ClampingScrollPhysics(),
scrollDirection: Axis.horizontal,
itemCount: FlexColor.schemesList.length,
itemBuilder: (BuildContext context, int index) {
return FlexThemeModeOptionButton(
optionButtonBorderRadius: 12,
height: 32,
width: 32,
padding: const EdgeInsets.all(0.4),
optionButtonMargin: EdgeInsets.zero,
borderRadius: 0,
unselectedBorder: BorderSide.none,
selectedBorder: BorderSide(
color: Theme.of(context).primaryColorLight,
width: 5,
),
onSelect: () {
scrollController.animateTo(
_kWidthOfScrollItem * index,
duration: const Duration(milliseconds: 350),
curve: Curves.easeOutCubic,
);
schemeIndex = index;
appStore.setColorSchemeIndex(index);
},
selected: appStore.colorSchemeIndex == index,
backgroundColor: Theme.of(context).colorScheme.surface,
flexSchemeColor: isLight
? FlexColor.schemesList[index].light
: FlexColor.schemesList[index].dark,
);
},
),
),
],
),
);
}
}