Как нарисовать границу вокруг DropdownButton, как границу TextFormField?
На StackOverflow есть много ответов, в которых объясняется, как нарисовать рамку вокруг виджета. Однако я ищу что-то вроде TextFormField.
Обычный DropdownButton имеет только атрибут, но я ищу что-то вроде следующего дизайна:
Как вы можете видеть здесь, выпадающий список имеет границу и заголовок. Я могу удалить
underline
из виджета DropdownButton, но есть ли какой-нибудь настраиваемый виджет, который я могу использовать для обертывания DropdownButton?
2 ответа
Вы можете воспроизвести это с помощью
PopupMenuButton
или заверните под
InputDecorator
затем скрыть подчеркивание с помощью
DropdownButtonHideUnderline
/// Flutter code sample for DropdownButton
// This sample shows a `DropdownButton` with a large arrow icon,
// purple text style, and bold purple underline, whose value is one of "One",
// "Two", "Free", or "Four".
//
// ![](https://flutter.github.io/assets-for-api-docs/assets/material/dropdown_button.png)
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
/// This is the main application widget.
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
static const String _title = 'Flutter Code Sample';
@override
Widget build(BuildContext context) {
return MaterialApp(
title: _title,
home: Scaffold(
appBar: AppBar(title: const Text(_title)),
body: const Center(
child: MyStatefulWidget(),
),
),
);
}
}
/// This is the stateful widget that the main application instantiates.
class MyStatefulWidget extends StatefulWidget {
const MyStatefulWidget({Key? key}) : super(key: key);
@override
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
/// This is the private State class that goes with MyStatefulWidget.
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
String dropdownValue = 'One';
@override
Widget build(BuildContext context) {
return InputDecorator(
decoration: InputDecoration(
contentPadding: EdgeInsets.symmetric(
horizontal: 20.0, vertical: 15.0),
labelText: 'Label',
border:
OutlineInputBorder(borderRadius: BorderRadius.circular(5.0)),
),
child: DropdownButtonHideUnderline( child:DropdownButton<String>(
value: dropdownValue,
icon: const Icon(Icons.arrow_drop_down),
iconSize: 24,
elevation: 16,
style: const TextStyle(color: Colors.deepPurple),
onChanged: (String? newValue) {
setState(() {
dropdownValue = newValue!;
});
},
items: <String>['One', 'Two', 'Free', 'Four']
.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
), ),
);
}
}
Я не знал, что есть еще один виджет, специально созданный для использования в форме. DropdownButtonFormField - это виджет, и ему не нужны все лишние строки, упомянутые @flakerimi.
Это мой пример кода для тех, кто хочет посмотреть.
DropdownButtonFormField<String>(
validator: (value) =>
dropdownValue == null ? S.of(context).general_make_selection : null,
autovalidateMode: AutovalidateMode.onUserInteraction,
value: dropdownValue,
decoration: InputDecoration(
labelText: S.of(context).bill_obj_type,
filled: true,
),
icon: const Icon(Icons.arrow_drop_down),
iconSize: 24,
elevation: 16,
isExpanded: true,
style: Theme.of(context)
.textTheme
.subtitle1
.copyWith(color: AppColors.neutral1),
onChanged: (String newValue) {
setState(() {
dropdownValue = newValue;
vm.objectionType = newValue;
});
},
items: _getDropdownMenuItems(),
);