Проблема заключается в том, что если вы используете какой-либо список, то для него требуется указание c высоты их родительского виджета, в котором может создаваться просмотр списка.
Если вы используете ListView с ShrinkWrap: true и некоторым другим виджетом, который он будет создавать но высота нижнего листа становится высотой всего экрана.
Окончательное решение: мы можем создать переменную в отдельном методе, добавить в нее все элементы и, наконец, вызвать этот метод в действии.
Следующая подсказка кода Вы должны понять.
создать следующий метод:
callme() {
List<Widget> mywidget = List();
leaveTypes.forEach((e) => mywidget.add(CupertinoActionSheetAction(
child: Text(e),
onPressed: () {
setState(() {
applyLeaveType = e;
});
Navigator.pop(context);
})));
return mywidget;
}
Вызовите этот метод в действии следующим образом.
actions: callme()
Обновление:
Рабочая демоверсия:
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
List<String> leaveTypes = [
"Vacation Leave",
"Ordinary Sick Leave",
"Childcare Leave"
];
String applyLeaveType;
callme() {
List<Widget> mywidget = List();
leaveTypes.forEach((e) => mywidget.add(CupertinoActionSheetAction(
child: Text(e),
onPressed: () {
setState(() {
applyLeaveType = e;
});
Navigator.pop(context);
})));
return mywidget;
}
@override
Widget build(BuildContext context) {
if (applyLeaveType == null) {
applyLeaveType = leaveTypes[0];
}
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: LayoutBuilder(builder: (context, constraints) {
return SingleChildScrollView(
child: Container(
height: constraints.maxHeight,
color: Color.fromARGB(255, 244, 246, 249),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
alignment: Alignment(-1.0, 0.0),
padding: EdgeInsets.only(
top: 10, bottom: 5, left: 20, right: 20),
child: Text(
"I want to apply for",
style: TextStyle(fontSize: 16),
textAlign: TextAlign.left,
)),
SizedBox(
width: MediaQuery.of(context).size.width,
height: 80,
child: GestureDetector(
onTap: () {
final action = Container(
child: CupertinoActionSheet(
title: Text("Leave Type",
style: TextStyle(fontSize: 16)),
actions: callme(),
cancelButton:
CupertinoActionSheetAction(
child: Text("Back"),
onPressed: () {
Navigator.pop(context);
})));
showCupertinoModalPopup(
context: context,
builder: (context) => action);
},
child: Container(
alignment: Alignment(0.0, 0.0),
padding: EdgeInsets.only(
top: 10, bottom: 10, left: 20, right: 20),
decoration: BoxDecoration(
color: Colors.white,
),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(
padding: EdgeInsets.all(10),
child: Text(applyLeaveType),
),
Container(
padding: EdgeInsets.all(10),
child:
Icon(Icons.keyboard_arrow_down))
],
))),
)
])));
}));
}
}