Навигация внутри будущего метода flutter - PullRequest
1 голос
/ 03 августа 2020

Я пытаюсь перейти на экран из будущего метода. Однако я получаю сообщение об ошибке неопределенного контекста имени. Я пробовал перемещаться из сборки виджета, но параметр создается в этом методе, и он мне нужен для навигации. Я очень долго зацикливался на этом. Любая помощь будет очень признательна.

Future<void> addBookingConversation(Booking booking) async {
    Conversation conversation = Conversation();
    await conversation.addConversationToFirestore(booking.posting.host); //additional method working fine
    String text = "Hi, my name is ${AppConstants.currentUser.firstName}";
    await conversation.addMessageToFirestore(text); //additional method working fine
    //this is where i should navigate to the conversation page and facing the error here
    Navigator.push(
      context, //error here context undefined
      MaterialPageRoute(builder:
          (context) => ConversationPage(conversation: conversation,),
      ),
    );
  }
class ConversationPage extends StatefulWidget {

  final Conversation conversation;

  static final String routeName = '/conversationPageRoute';

  ConversationPage({this.conversation, Key key}) : super(key: key);

  @override
  _ConversationPageState createState() => _ConversationPageState();
}

class _ConversationPageState extends State<ConversationPage> {

  Conversation _conversation;
  // additional code of wiget build
  }

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Я не знаю, где находится ваша функция, поэтому вот несколько общих советов:

Если вы не можете получить доступ к переменной в вашем методе, у вас есть два варианта: передать ее как параметр от вызывающего. Или верните результат вызывающей стороне, чтобы они могли сами выполнить ту часть, где требуется переменная.

Что это означает для вашего сценария: либо вам нужен context как дополнительный параметр в вашем методе, либо вам нужно вернуть Future<Conversation> из вашего метода и обработать навигацию там, где он вызывается.

Лично я бы предпочел второй вариант, поскольку ваш бизнес-лог c начала разговора и ваше приложение Навигация - это две разные проблемы, которые не следует смешивать в одном методе.

0 голосов
/ 14 августа 2020

Если вы хотите вызвать метод навигатора в любом месте приложения.

class NavigationService {
  final GlobalKey<NavigatorState> globalKey = GlobalKey<NavigatorState>();

  Future<dynamic> navigateTo(Route Route) {   
  return globalKey.currentState.push(Route);
  }
}

и в main.dart.

 navigatorKey: NavigationService().globalKey,

, а затем в любом месте приложения. Просто используйте это

Future<void> addBookingConversation(Booking booking) async {
Conversation conversation = Conversation();
await conversation.addConversationToFirestore(booking.posting.host); 
//additional method working fine
String text = "Hi, my name is ${AppConstants.currentUser.firstName}";
await conversation.addMessageToFirestore(text); //additional method working 
fine
//this is where i should navigate to the conversation page and facing the 
error here
NavigationService().navigateTo(
MaterialPageRoute(builder:
      (context) => ConversationPage(conversation: conversation,),
  ),);
}
...