【问题标题】:Flutter Navigator.pushNamed() contextFlutter Navigator.pushNamed() 上下文
【发布时间】:2020-12-06 22:32:04
【问题描述】:

我想使用 Navigator.pushNamed 重定向到另一个页面,但出现错误。

这正是我得到的错误;

   The method 'findAncestorStateOfType' was called on null.
   Receiver: null
   Tried calling: findAncestorStateOfType<NavigatorState>()**

我的代码(我使用 navigatorservice。);

class CalendarPage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _CalendarPageState();
}
}

class _CalendarPageState extends State {
@override
Widget build(BuildContext context) {
SystemChrome.setEnabledSystemUIOverlays([SystemUiOverlay.bottom]);
return MaterialApp(
  localizationsDelegates: [
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
    SfGlobalLocalizations.delegate
  ],
  supportedLocales: [
    const Locale('tr'),
  ],
  locale: const Locale('tr'),
  home: Scaffold(
    body: Container(
      child: SfCalendar(
        onTap: testOnTap,
        view: CalendarView.month,
        dataSource: MeetingDataSource(_getDataSource()),
        monthViewSettings: MonthViewSettings(
            showAgenda: true,
            appointmentDisplayMode:
                MonthAppointmentDisplayMode.appointment),
       ),
    ),
   ),
  );
 }
}

导航:

if (reItem == datetest) {
    Navigator.pushNamed(
        _CalendarPageState().context, CalendarDataGridRoute);

testOnTap:

void testOnTap(CalendarTapDetails details) {
if (details.targetElement == CalendarElement.agenda) {
final dates = <ClickedDate>[];
dates.add(ClickedDate(details.date));
final datetest = dates[0].date.year.toString() +
    "-" +
    dates[0].date.month.toString() +
    "-" +
    dates[0].date.day.toString();
List<Meeting> list = _getDataSource();
for (var item in list) {
  final reItem = item.baslangic.year.toString() +
      "-" +
      item.baslangic.month.toString() +
      "-" +
      item.baslangic.day.toString();
  if (reItem == datetest) {
    Navigator.pushNamed(
        _CalendarPageState().context, CalendarDataGridRoute);
  }
}

我可能使用了错误的上下文,你能帮帮我吗?

【问题讨论】:

  • 是的,您没有使用正确的上下文。您可以直接将您的上下文作为参数发送吗?
  • 当我想将它作为参数发送时,缺少1个参数。但如果我不添加任何参数,它就可以正常工作。 testOnTap(context) = Wants 2 参数(CalendarTapDetails) testOntap =working.
  • 你也可以在你的问题中添加 testOnTap 方法吗?
  • 我添加了你想要的。

标签: flutter dart


【解决方案1】:

你不能使用任何你喜欢的BuildContext 对象。在您的情况下,您正在创建树中不存在且其上下文为空的状态的新实例。

您需要使用以Navigator 作为其祖先的上下文。看来您正在尝试使用 MaterialApp 导航器,因此您需要低于该值的上下文。您拥有的当前上下文位于 MaterialApp 上方,因此您需要使用 Builder 来获取其下方的上下文。

class _CalendarPageState extends State {
@override
Widget build(BuildContext context) {
SystemChrome.setEnabledSystemUIOverlays([SystemUiOverlay.bottom]);
return MaterialApp(
  localizationsDelegates: [
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
    SfGlobalLocalizations.delegate
  ],
  supportedLocales: [
    const Locale('tr'),
  ],
  locale: const Locale('tr'),
  home: Scaffold(
    body: Container(
      child: Builder(//Wrap the place where you need new context with a Builder
        builder: (newContext) {
          return SfCalendar(
            onTap: (details) {
              testOnTap(details, newContext);//Use newContext and modified testOnTap method here
            },
            view: CalendarView.month,
            dataSource: MeetingDataSource(_getDataSource()),
            monthViewSettings: MonthViewSettings(
              showAgenda: true,
              appointmentDisplayMode: MonthAppointmentDisplayMode.appointment
            ),
         );
      ),
    ),
   ),
  );
 }
}

您还需要修改您的 testOnTap 以获取此上下文:

void testOnTap(CalendarTapDetails details, BuildContext context) {//Take context as another parameter
if (details.targetElement == CalendarElement.agenda) {
final dates = <ClickedDate>[];
dates.add(ClickedDate(details.date));
final datetest = dates[0].date.year.toString() +
    "-" +
    dates[0].date.month.toString() +
    "-" +
    dates[0].date.day.toString();
List<Meeting> list = _getDataSource();
for (var item in list) {
  final reItem = item.baslangic.year.toString() +
      "-" +
      item.baslangic.month.toString() +
      "-" +
      item.baslangic.day.toString();
  if (reItem == datetest) {
    Navigator.pushNamed(
        context, CalendarDataGridRoute);//Pass the received context here
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2020-06-06
    • 2021-01-26
    • 2020-06-14
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    相关资源
    最近更新 更多