Flutter CupertinoActionSheet:如何定义可变数量的动作
Flutter CupertinoActionSheet: how to define Variable number of actions
取决于 List distinctEmnen 中的条目数,
我想显示可变数量的菜单选项。
是否有可能实现这样的目标?
CupertinoActionSheet(
title: Text( tjo),
actions: [
CupertinoActionSheetAction(
child: Text( distinctEmnen[0]),
Navigator.of(context).pushNamed(distinctEmnen[0]);
}),
CupertinoActionSheetAction(
child: Text( distinctEmnen[1]),
onPressed: () {
Navigator.of(context).pushNamed(distinctEmnen[1]);
}),
CupertinoActionSheetAction(
child: Text( distinctEmnen[n...]),
onPressed: () {
Navigator.of(context).pushNamed(distinctEmnen[n...]);
}),
],
cancelButton: CupertinoActionSheetAction(
child: Text('Cancel'),
onPressed: () => Navigator.of(context).pop(),
),
),
您可以复制粘贴运行下面的完整代码
第 1 步:您可以定义一个 class Emnen
第 2 步:初始化 List<Emnen> distinctEmnen
第 3 步:使用 List<Widget>.generate(distinctEmnen.length,
代码片段
class Emnen {
String title;
String routeName;
Emnen({this.title, this.routeName});
}
...
List<Emnen> distinctEmnen = [];
...
@override
void initState() {
distinctEmnen = [
Emnen(title: "1", routeName: "/1"),
Emnen(title: "2", routeName: "/2")
];
super.initState();
}
...
CupertinoActionSheet(
title: Text("tjo"),
actions: List<Widget>.generate(
distinctEmnen.length,
(int index) => CupertinoActionSheetAction(
child: Text(distinctEmnen[index].title),
onPressed: () => Navigator.of(context)
.pushNamed(distinctEmnen[index].routeName))));
工作演示
完整代码
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class Emnen {
String title;
String routeName;
Emnen({this.title, this.routeName});
}
class CupertinoActionSheetApp extends StatelessWidget {
@override
Widget build(BuildContext context) => CupertinoApp(
initialRoute: "/",
routes: {
'/': (context) => HomePage(),
'/1': (context) => FirstScreen(),
'/2': (context) => SecondScreen(),
},
);
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
List<Emnen> distinctEmnen = [];
@override
void initState() {
distinctEmnen = [
Emnen(title: "1", routeName: "/1"),
Emnen(title: "2", routeName: "/2")
];
super.initState();
}
@override
Widget build(BuildContext context) {
return Center(
child: CupertinoButton(
child: Text("show dialog"),
onPressed: () {
_showDialog(context);
}),
);
}
void _showDialog(BuildContext cxt) {
showCupertinoModalPopup<int>(
context: cxt,
builder: (cxt) {
var dialog = CupertinoActionSheet(
title: Text("tjo"),
actions: List<Widget>.generate(
distinctEmnen.length,
(int index) => CupertinoActionSheetAction(
child: Text(distinctEmnen[index].title),
onPressed: () => Navigator.of(context)
.pushNamed(distinctEmnen[index].routeName))));
return dialog;
});
}
}
void main() {
runApp(CupertinoActionSheetApp());
}
class FirstScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text("Cupertino App"),
),
child: Center(
child: Text("First"),
),
);
}
}
class SecondScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text("Cupertino App"),
),
child: Center(
child: Text("Second"),
),
);
}
}
完整代码
取决于 List distinctEmnen 中的条目数, 我想显示可变数量的菜单选项。 是否有可能实现这样的目标?
CupertinoActionSheet(
title: Text( tjo),
actions: [
CupertinoActionSheetAction(
child: Text( distinctEmnen[0]),
Navigator.of(context).pushNamed(distinctEmnen[0]);
}),
CupertinoActionSheetAction(
child: Text( distinctEmnen[1]),
onPressed: () {
Navigator.of(context).pushNamed(distinctEmnen[1]);
}),
CupertinoActionSheetAction(
child: Text( distinctEmnen[n...]),
onPressed: () {
Navigator.of(context).pushNamed(distinctEmnen[n...]);
}),
],
cancelButton: CupertinoActionSheetAction(
child: Text('Cancel'),
onPressed: () => Navigator.of(context).pop(),
),
),
您可以复制粘贴运行下面的完整代码
第 1 步:您可以定义一个 class Emnen
第 2 步:初始化 List<Emnen> distinctEmnen
第 3 步:使用 List<Widget>.generate(distinctEmnen.length,
代码片段
class Emnen {
String title;
String routeName;
Emnen({this.title, this.routeName});
}
...
List<Emnen> distinctEmnen = [];
...
@override
void initState() {
distinctEmnen = [
Emnen(title: "1", routeName: "/1"),
Emnen(title: "2", routeName: "/2")
];
super.initState();
}
...
CupertinoActionSheet(
title: Text("tjo"),
actions: List<Widget>.generate(
distinctEmnen.length,
(int index) => CupertinoActionSheetAction(
child: Text(distinctEmnen[index].title),
onPressed: () => Navigator.of(context)
.pushNamed(distinctEmnen[index].routeName))));
工作演示
完整代码
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class Emnen {
String title;
String routeName;
Emnen({this.title, this.routeName});
}
class CupertinoActionSheetApp extends StatelessWidget {
@override
Widget build(BuildContext context) => CupertinoApp(
initialRoute: "/",
routes: {
'/': (context) => HomePage(),
'/1': (context) => FirstScreen(),
'/2': (context) => SecondScreen(),
},
);
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
List<Emnen> distinctEmnen = [];
@override
void initState() {
distinctEmnen = [
Emnen(title: "1", routeName: "/1"),
Emnen(title: "2", routeName: "/2")
];
super.initState();
}
@override
Widget build(BuildContext context) {
return Center(
child: CupertinoButton(
child: Text("show dialog"),
onPressed: () {
_showDialog(context);
}),
);
}
void _showDialog(BuildContext cxt) {
showCupertinoModalPopup<int>(
context: cxt,
builder: (cxt) {
var dialog = CupertinoActionSheet(
title: Text("tjo"),
actions: List<Widget>.generate(
distinctEmnen.length,
(int index) => CupertinoActionSheetAction(
child: Text(distinctEmnen[index].title),
onPressed: () => Navigator.of(context)
.pushNamed(distinctEmnen[index].routeName))));
return dialog;
});
}
}
void main() {
runApp(CupertinoActionSheetApp());
}
class FirstScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text("Cupertino App"),
),
child: Center(
child: Text("First"),
),
);
}
}
class SecondScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text("Cupertino App"),
),
child: Center(
child: Text("Second"),
),
);
}
}
完整代码