import 'package:ConversionFlutterDemo/models/convert_contain_options_bean.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import '../../states/convert_options_provider.dart'; class ConvertImageOptionsWidget extends StatefulWidget { const ConvertImageOptionsWidget({Key? key}) : super(key: key); @override State createState() => _ConvertImageOptionsWidgetState(); } class _ConvertImageOptionsWidgetState extends State { @override Widget build(BuildContext context) { bool containAnnotations = context.select( (value) => value.imageOptions.containAnnotations); return Padding( padding: EdgeInsets.all(8), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ const Text('ContainAnnotations'), Switch( value: containAnnotations, onChanged: (value) { context .read() .changeImageOptions(containAnnotations: value); }) ], ), Text('ImageDpi:'), TextFormField( keyboardType: TextInputType.number, textInputAction: TextInputAction.done, initialValue: "300", maxLength: 1000, inputFormatters: [ FilteringTextInputFormatter.allow(RegExp(r'^\d{1,4}(\.\d{0,2})?')), FilteringTextInputFormatter.deny(RegExp(r'[\\,|\\.]')), LengthLimitingTextInputFormatter(4) ], decoration: InputDecoration(labelText: '请输入范围在1~1000内的整数'), onChanged: (value){ context .read() .changeImageOptions(imageDpi: int.parse(value)); }, ), imagePageOptions((value) { context .read() .changeImageOptions(imagePageOptions: value); }) ], ), ); } Widget imagePageOptions(ValueChanged onChanged) { ImagePageOptions imagePageOptions = context.select( (value) => value.imageOptions.imagePageOptions); return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text('Page Options:'), _imagePageOptionsItem( imagePageOptions, ImagePageOptions.JPEG, onChanged), _imagePageOptionsItem( imagePageOptions, ImagePageOptions.PNG, onChanged), ], ); } Widget _imagePageOptionsItem(ImagePageOptions currentOptions, ImagePageOptions options, ValueChanged onChanged) { return CheckboxListTile( controlAffinity: ListTileControlAffinity.leading, title: Text(options.name), value: currentOptions == options, onChanged: (value) { onChanged(options); }); } }