Как передать данные другому окну и запретить возвращаться назад?

Для передачи данных из одного окна приложения Flutter в другое окно и запрещения возвращения назад можно использовать пакет flutter_bloc и механизм навигации, предоставляемый пакетом flutter_bloc.

Передача данных из одного окна в другое может быть выполнена с использованием Bloc и Repository. Bloc предоставляет реактивное состояние данных, а Repository служит для получения и обновления данных.

Для начала создайте класс Bloc, который будет содержать данные, которые вы хотите передать.

class DataBloc extends Bloc<dynamic, dynamic> {
  DataBloc() : super(null);

  void setData(dynamic data) {
    emit(data);
  }
}

Затем создайте класс Repository, который будет выполнять передачу данных между окнами.

class DataRepository {
  DataBloc _dataBloc = DataBloc();

  DataBloc get dataBloc => _dataBloc;

  void setData(dynamic data) {
    _dataBloc.setData(data);
  }
}

Теперь вы можете использовать DataRepository для передачи данных между окнами. Создайте экземпляр DataRepository в вашем основном виджете и передайте его в каждое окно, где вы хотите использовать переданные данные.

class MyApp extends StatelessWidget {
  final DataRepository _dataRepository = DataRepository();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BlocProvider(
        create: (context) => _dataRepository.dataBloc,
        child: FirstPage(dataRepository: _dataRepository),
      ),
    );
  }
}

На странице, с которой вы хотите передать данные, вызовите метод setData из DataRepository.

class FirstPage extends StatelessWidget {
  final DataRepository dataRepository;

  FirstPage({this.dataRepository});

  void _navigateToSecondPage(BuildContext context) {
    dataRepository.setData('Передаваемые данные');
    Navigator.push(
      context,
      MaterialPageRoute(
        builder: (context) => SecondPage(),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: RaisedButton(
          onPressed: () => _navigateToSecondPage(context),
          child: Text('Перейти на вторую страницу'),
        ),
      ),
    );
  }
}

На второй странице вы можете получить переданные данные с помощью BlocBuilder.

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: BlocBuilder<DataBloc, dynamic>(
          builder: (context, state) {
            if (state != null) {
              // Переданные данные
              return Text('Переданные данные: $state');
            } else {
              return Text('Данные не переданы');
            }
          },
        ),
      ),
    );
  }
}

Теперь, когда вы перейдете на вторую страницу, вы увидите переданные данные, и вы не сможете вернуться обратно. Это происходит потому, что Navigator.push() заменяет текущую страницу новой страницей в стеке навигации, и поэтому при возврате назад не будет доступна предыдущая страница.

Надеюсь, эта подробная информация поможет вам передать данные между окнами и запретить возврат к предыдущему окну в вашем приложении Flutter.