Flutter 有没有办法将导航路线添加到颤振/省道列表中?

Flutter 有没有办法将导航路线添加到颤振/省道列表中?,flutter,dart,Flutter,Dart,我不熟悉颤振/飞镖,但我尝试了几种方法将导航路线添加到指定给栅格视图的列表中。这可能不是最有效的方法,但却是我想到的第一件事。我想在卡片上加一个墨水池,让导航路线通过。除此之外,我能想到的唯一其他解决方案是创建一个在列表中迭代的OnTap函数。目前,导航列表选项给了我一个错误,即“未来对象不能分配给导航器的参数类型”,我得到这个错误是因为它是一个常量。但我尝试了其他一些方法,得到了类似的结果。我当前的配置有什么问题?是否有更好/更有效的解决方案 这是我的选择列表: class Choice {

我不熟悉颤振/飞镖,但我尝试了几种方法将导航路线添加到指定给栅格视图的列表中。这可能不是最有效的方法,但却是我想到的第一件事。我想在卡片上加一个墨水池,让导航路线通过。除此之外,我能想到的唯一其他解决方案是创建一个在列表中迭代的OnTap函数。目前,导航列表选项给了我一个错误,即“未来对象不能分配给导航器的参数类型”,我得到这个错误是因为它是一个常量。但我尝试了其他一些方法,得到了类似的结果。我当前的配置有什么问题?是否有更好/更有效的解决方案

这是我的选择列表:

class Choice {
  const Choice({this.title, this.icon, this.nav});
  final String title;
  final IconData icon;
  final Navigator nav;
}

const List<Choice> choices = const <Choice>[
  const Choice(title: 'Timer', icon: Icons.timer, nav: Navigator.pushNamed(context, TestConfirmation.id)),
  const Choice(title: 'Seating Chart', icon: Icons.event_seat),
  const Choice(title: 'Random', icon: Icons.shuffle),
  const Choice(title: 'Group Maker', icon: Icons.group_add),
  const Choice(title: 'Noise Monitor', icon: Icons.hearing),
  const Choice(title: 'Assign Tasks', icon: Icons.assignment_ind),
  const Choice(title: 'Survey', icon: Icons.rate_review),
  const Choice(title: 'Permission Slips', icon: Icons.assignment),
  const Choice(title: 'Lesson Plans', icon: Icons.local_library),
  const Choice(title: 'Attendance', icon: Icons.schedule),
  const Choice(title: 'Gradebook', icon: Icons.insert_chart)
];
class ChoiceCard extends StatelessWidget {
  const ChoiceCard({Key key, this.choice}) : super(key: key);
  final Choice choice;

  @override
  Widget build(BuildContext context) {
    final TextStyle textStyle = Theme.of(context).textTheme.subhead;
    return Card(
        color: Colors.white,
        child: InkWell(
          //onTap: choice.navigation,
          child: Center(
            child: Column(
                mainAxisSize: MainAxisSize.min,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                  Expanded(
                      child: Icon(choice.icon,
                          size: 90.0, color: textStyle.color)),
                  Text(choice.title, style: textStyle),
                ]),
          ),
        ));
  }
}
类选择{
常量选择({this.title,this.icon,this.nav});
最后的字符串标题;
最终的Iconda图标;
最终导航仪导航;
}
常量列表选项=常量[
常量选项(标题:“计时器”,图标:Icons.Timer,导航:Navigator.pushNamed(上下文,TestConfirmation.id)),
常量选择(标题:“座位表”,图标:图标。事件座位),
常量选择(标题:“随机”,图标:图标。随机),
常量选择(标题:“组生成器”,图标:图标。组添加),
常量选择(标题:“噪音监视器”,图标:图标。听力),
常量选项(标题:“分配任务”,图标:Icons.assignment\u ind),
常数选择(标题:“调查”,图标:图标。费率审查),
const选项(标题:“权限单”,图标:Icons.assignment),
const选项(标题:“课程计划”,图标:Icons.local_library),
常数选择(标题:“出席”,图标:图标。时间表),
常量选项(标题:“成绩册”,图标:图标。插入图表)
];
这是我的名片:

class Choice {
  const Choice({this.title, this.icon, this.nav});
  final String title;
  final IconData icon;
  final Navigator nav;
}

const List<Choice> choices = const <Choice>[
  const Choice(title: 'Timer', icon: Icons.timer, nav: Navigator.pushNamed(context, TestConfirmation.id)),
  const Choice(title: 'Seating Chart', icon: Icons.event_seat),
  const Choice(title: 'Random', icon: Icons.shuffle),
  const Choice(title: 'Group Maker', icon: Icons.group_add),
  const Choice(title: 'Noise Monitor', icon: Icons.hearing),
  const Choice(title: 'Assign Tasks', icon: Icons.assignment_ind),
  const Choice(title: 'Survey', icon: Icons.rate_review),
  const Choice(title: 'Permission Slips', icon: Icons.assignment),
  const Choice(title: 'Lesson Plans', icon: Icons.local_library),
  const Choice(title: 'Attendance', icon: Icons.schedule),
  const Choice(title: 'Gradebook', icon: Icons.insert_chart)
];
class ChoiceCard extends StatelessWidget {
  const ChoiceCard({Key key, this.choice}) : super(key: key);
  final Choice choice;

  @override
  Widget build(BuildContext context) {
    final TextStyle textStyle = Theme.of(context).textTheme.subhead;
    return Card(
        color: Colors.white,
        child: InkWell(
          //onTap: choice.navigation,
          child: Center(
            child: Column(
                mainAxisSize: MainAxisSize.min,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                  Expanded(
                      child: Icon(choice.icon,
                          size: 90.0, color: textStyle.color)),
                  Text(choice.title, style: textStyle),
                ]),
          ),
        ));
  }
}
class ChoiceCard扩展了无状态小部件{
const ChoiceCard({Key-Key,this.choice}):super(Key:Key);
最终选择;
@凌驾
小部件构建(构建上下文){
final TextStyle TextStyle=Theme.of(context).textTheme.subhead;
回程卡(
颜色:颜色,白色,
孩子:InkWell(
//onTap:choice.navigation,
儿童:中心(
子:列(
mainAxisSize:mainAxisSize.min,
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
扩大(
子:图标(choice.Icon,
尺寸:90.0,颜色:textStyle.color),
文本(choice.title,style:textStyle),
]),
),
));
}
}

您可以复制粘贴运行下面的完整代码
您可以使用
函数
代替
导航器

代码片段

class Choice {
  String title;
  IconData icon;
  Function nav;

...

@override
  void initState() {
    choices = [
      Choice(
          title: 'Timer',
          icon: Icons.timer,
          nav: () {
            Navigator.pushNamed(context, "/first");
          }),
      Choice(
          title: 'Seating Chart',
          icon: Icons.event_seat,
          nav: () {
            Navigator.pushNamed(context, "/second");
          }),  
工作演示

完整代码

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        initialRoute: '/',
        routes: {
          '/': (context) => HomeContent(),
          '/first': (context) => FirstScreen(),
          '/second': (context) => SecondScreen(),
        });
  }
}

class Choice {
  String title;
  IconData icon;
  Function nav;

  Choice({this.title, this.icon, this.nav});
}

class HomeContent extends StatefulWidget {
  // builder
  @override
  _HomeContentState createState() => _HomeContentState();
}

class _HomeContentState extends State<HomeContent> {
  List<Choice> choices = [];

  @override
  void initState() {
    choices = [
      Choice(
          title: 'Timer',
          icon: Icons.timer,
          nav: () {
            Navigator.pushNamed(context, "/first");
          }),
      Choice(
          title: 'Seating Chart',
          icon: Icons.event_seat,
          nav: () {
            Navigator.pushNamed(context, "/second");
          }),
      Choice(title: 'Random', icon: Icons.shuffle),
      Choice(title: 'Group Maker', icon: Icons.group_add),
      Choice(title: 'Noise Monitor', icon: Icons.hearing),
      Choice(title: 'Assign Tasks', icon: Icons.assignment_ind),
      Choice(title: 'Survey', icon: Icons.rate_review),
      Choice(title: 'Permission Slips', icon: Icons.assignment),
      Choice(title: 'Lesson Plans', icon: Icons.local_library),
      Choice(title: 'Attendance', icon: Icons.schedule),
      Choice(title: 'Gradebook', icon: Icons.insert_chart)
    ];
  }

  Widget _itemBuilderFunc(BuildContext context, int index) {
    return ChoiceCard(
      choice: choices[index],
    );
  }

  @override
  Widget build(BuildContext context) {
    return GridView.builder(
      itemCount: choices.length,
      itemBuilder: this._itemBuilderFunc,
      padding: EdgeInsets.fromLTRB(12, 12, 12, 0),
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 2,
          crossAxisSpacing: 10,
          mainAxisSpacing: 10,
          childAspectRatio: 0.75),
    );
  }
}

class ChoiceCard extends StatelessWidget {
  const ChoiceCard({Key key, this.choice}) : super(key: key);
  final Choice choice;

  @override
  Widget build(BuildContext context) {
    final TextStyle textStyle = Theme.of(context).textTheme.subhead;
    return Card(
        color: Colors.white,
        child: InkWell(
          onTap: choice.nav,
          child: Center(
            child: Column(
                mainAxisSize: MainAxisSize.min,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                  Expanded(
                      child: Icon(choice.icon,
                          size: 90.0, color: textStyle.color)),
                  Text(choice.title, style: textStyle),
                ]),
          ),
        ));
  }
}

class FirstScreen extends StatefulWidget {
  @override
  _FirstScreenState createState() => _FirstScreenState();
}

class _FirstScreenState extends State<FirstScreen> {
  @override
  Widget build(BuildContext context) {
    return Text("First Screen");
  }
}

class SecondScreen extends StatefulWidget {
  @override
  _SecondScreenState createState() => _SecondScreenState();
}

class _SecondScreenState extends State<SecondScreen> {
  @override
  Widget build(BuildContext context) {
    return Text("Second Screen");
  }
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
initialRoute:“/”,
路线:{
“/”:(上下文)=>HomeContent(),
“/first”:(上下文)=>FirstScreen(),
“/second”:(上下文)=>SecondScreen(),
});
}
}
班级选择{
字符串标题;
Iconda图标;
功能导航;
选项({this.title,this.icon,this.nav});
}
类HomeContent扩展StatefulWidget{
//建筑商
@凌驾
_HomeContentState createState()=>\u HomeContentState();
}
类_HomeContentState扩展状态{
列表选项=[];
@凌驾
void initState(){
选择=[
选择(
标题:“计时器”,
图标:Icons.timer,
导航:(){
Navigator.pushNamed(上下文,“/first”);
}),
选择(
标题:“座位表”,
图标:Icons.event_座位,
导航:(){
Navigator.pushNamed(上下文,“/second”);
}),
选择(标题:“随机”,图标:Icons.shuffle),
选择(标题:“组生成器”,图标:图标。组添加),
选择(标题:“噪音监视器”,图标:Icons.hearing),
选项(标题:“分配任务”,图标:Icons.assignment\u ind),
选择(标题:“调查”,图标:图标。评分审查),
选项(标题:“权限单”,图标:Icons.assignment),
选择(标题:“课程计划”,图标:Icons.local_library),
选择(标题:“出席”,图标:图标。时间表),
选项(标题:“成绩册”,图标:图标。插入图表)
];
}
Widget\u itemBuilderFunc(BuildContext上下文,int索引){
返回选择卡(
选项:选项[索引],
);
}
@凌驾
小部件构建(构建上下文){
返回GridView.builder(
itemCount:choices.length,
itemBuilder:这个,
填充:从LTRB(12,12,12,0)开始的边缘设置,
gridDelegate:SliverGridDelegateWithFixedCrossAxisCount(
交叉轴计数:2,
横轴间距:10,
平均间距:10,
儿童比例:0.75),
);
}
}
类ChoiceCard扩展了无状态小部件{
const ChoiceCard({Key-Key,this.choice}):super(Key:Key);
最终选择;
@凌驾
小部件构建(构建上下文){
final TextStyle TextStyle=Theme.of(context).textTheme.subhead;
回程卡(
颜色:颜色,白色,
孩子:InkWell(
onTap:choice.nav,
儿童:中心(
子:列(
mainAxisSize:mainAxisSize.min,
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
扩大(
子:图标(choice.Icon,
尺寸:90.0,颜色:textStyle.color),
文本(choice.title,style:textStyle),
]),
),
));
}
}
类FirstScreen扩展StatefulWidget{
@凌驾
_FirstScreenState createState()=>\u FirstScreenState();
}
类_FirstScreenState扩展