Передача данных между виджетами без использования Navigator?

Я немного борюсь с флаттером. У меня есть два экрана сведений о виджетах, поэтому в первых сведениях у меня есть список, и я хочу отправить его на второй экран без использования навигатора.

Так что, если есть кто-то, кто может мне помочь, я буду очень благодарен.

Подробности :

 List<String> _instructions = [];

class Details extends StatefulWidget {
  @override
  _DetailsState createState() => new _DetailsState();
}

class _DetailsState extends State<Details> {
              Expanded(
                child: Container(
                  margin: EdgeInsets.all(3),
                  child: OutlineButton(
                    highlightElevation: 21,
                    color: Colors.white,
                    shape: StadiumBorder(),
                    textColor: Colors.lightBlue,
                    child: Text(
                      'ENVOYER',
                      style: TextStyle(
                        fontSize: 16,
                        fontWeight: FontWeight.bold,
                        fontStyle: FontStyle.normal,
                        color: Colors.lightBlue,
                      ),
                    ),
                    borderSide: BorderSide(
                        color: Colors.lightBlue,
                        style: BorderStyle.solid,
                        width: 1),
                    onPressed: () {

                    },
                  ),
                ),
              ),
}}

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

Можете ли вы вставить свой код здесь? пожалуйста, отредактируйте свой вопрос с кодом, который вы пробовали. Чтобы вам было легче помочь.

Pedro Massango 31.05.2019 03:40

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

loushou 31.05.2019 03:40

@PedroMassango, я сделал это, проверь мой код.

khaliloos benk 31.05.2019 03:54

Как вы хотите показать следующий виджет? Возможно, вы захотите использовать какой-нибудь шаблон управления архитектурой/состоянием!

Pedro Massango 31.05.2019 04:03

я хочу отобразить содержимое списка, когда я нажал кнопку отправки "ПОСЛАТЕЛЬ"

khaliloos benk 31.05.2019 04:28

вам нужно использовать конструктор.

Farhana Naaz Ansari 31.05.2019 06:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
256
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

вы можете использовать sharedpreferance, который представляет собой простой xml, принадлежащий приложению. И вот как вы можете установить это

Future<bool> setStringList(String key, List<String> value) =>
_setValue('StringList', key, value);

Future<bool> setStringList (
 String key, 
 List<String> value
) 

Для получения дополнительной информации здесь связь И вы можете получить свой список по

List<String> getStringList(String key) {
  List<Object> list = _preferenceCache[key];
    if (list != null && list is! List<String>) {
      list = list.cast<String>().toList();
      _preferenceCache[key] = list;
    }
    return list;
}

Также вы можете использовать скфлайт

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

Внутри блока:

  StreamController<String> _selectedItemController = new BehaviorSubject();

  Stream<String> get selectedItem => _selectedItemController.stream;

  void setSelected(String item) {
    _selectedItemController.add(item);
  }

Первый фрагмент:

class FragmentList extends StatelessWidget {
  final Bloc bloc;

  const FragmentList(
    this.bloc, {
    Key key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: bloc.selectedItem,
      initialData: "",
      builder: (BuildContext context, AsyncSnapshot<String> screenType) {
        return ListView.builder(
          itemBuilder: (context, index) {
            return ListTile(
              selected: bloc.items[index] == screenType.data,
              title: Text(bloc.items[index]),
              onTap: () {
                bloc.setSelected(bloc.items[index]);
              },
            );
          },
          itemCount: bloc.items.length,
        );
      },
    );
  }
}

Второй фрагмент:

class FragmentDetails extends StatelessWidget {
  final Bloc bloc;

  const FragmentDetails(
    this.bloc, {
    Key key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Center(
      child: StreamBuilder(
        initialData: "Nothing selected",
        stream: bloc.selectedItem,
        builder: (BuildContext context, AsyncSnapshot<String> screenType) {
          final info = screenType.data;
          return Text(info);
        },
      ),
    );
  }
}
Ответ принят как подходящий

Предположим, у вас есть две страницы, а именно «page1.dart» и «page2.dart», обе из которых хотят получить доступ к одному и тому же списку:

  1. Создайте еще один файл дротика «GlobalVariables.dart», внутри этого файла создайте класс gv.

  2. Внутри этого класса gv создайте статический список, используя:

static List <String> listAnyList = [];
  1. импортировать «GlobalVariables.dart» на 2 страницы, которым необходимо получить доступ к этому списку.

  2. Теперь в page1.dart и page2.dart, вы можете использовать gv.listAnyList для доступа к «Глобальному списку».

Используйте «Глобальные статические переменные», если переменная требуется во многих файлах дартс, например. «Идентификатор пользователя», вы можете просто использовать gv.strUserID для доступа к нему на любых страницах, которые вы хотите.

Другие вопросы по теме