如何在BuildContext之外的Flutter中使用路由?

时间:2019-02-20 22:28:24

标签: dart flutter

我正在尝试在Flutter中使用路线。按下选项卡时,我想导航到该页面。我已经包含了我尝试过的代码。

但是,这没有用,因为上下文未定义。

是否可以使用路由来完成此功能?

void choiceAction(String choice) {
  if (choice == Tabs.Settings) {
    print('Settings');
  }
  else if (choice == Tabs.Tutorial) {
    Navigator.push(
      context,
      MaterialPageRoute(
        builder: (context) => OnBoarding()),
    );
  }
}

更新: 我从PopupMenuButton调用choiceAction。

PopupMenuButton<String>(
                                      icon: Icon(
                                        Icons.settings,
                                        color: Colors.white,
                                        size: 30.0,
                                      ),
                                      onSelected: choiceAction("Tutorial", context),
                                      itemBuilder: (BuildContext context) {
                                        return Tabs.choices.map((String choice) {
                                          return PopupMenuItem<String>(
                                            value: choice,
                                            child: Text(choice),
                                          );
                                        }).toList();
                                      },
                                    )

2 个答案:

答案 0 :(得分:0)

您可以将BuildContext添加到choiceAction方法的变量中,并在每次调用此方法时传递当前上下文。

void choiceAction(String choice, BuildContext context) {
  if (choice == Tabs.Settings) {
    print('Settings');
  }
  else if (choice == Tabs.Tutorial) {
    Navigator.push(context, MaterialPageRoute(builder: (context) => OnBoarding()));
  }
}

从某个地方调用choiceAction方法

@override
Widget build(BuildContext context) {
  return RaisedButton(
    "Go to next page",
    onPressed: choiceAction("choice 1", context),
  );
} 

答案 1 :(得分:0)

如果您使用PopupMenuButton(小部件),则BuildContext始终可见。

如何使用PopupMenuButton不同于这种方法。
在PopupMenuButton#onSelected中指定的类型为 //my own public interface ITest{} public class B : ITest { public B() { } } public class MyClass<T> : B where T : ITest, new() { }

void Function(T value)