Как передать список из одного класса в другой во Flutter?

#flutter #dart

#flutter #dart

Вопрос:

Итак, у меня есть список, в который я добавляю данные на одном экране (каждый раз при нажатии определенной кнопки). Затем у меня есть нижняя панель навигации, которая позволяет мне переключаться между экранами (из-за этого также нет маршрута pop или push).

Моя проблема в том, что у меня два экрана. Я хочу получить доступ к списку из первого класса состояния внутри второго класса состояния.

Класс со списком:

 class Security extends StatefulWidget {
  @override
  _SecurityState createState() => _SecurityState();
}

class _SecurityState extends State<Security> {

  List<Log> my_logs = []; // i want data stored inside here

  @override
  Widget build(BuildContext context) {
    return Scaffold();
  }
}
  

Класс, в котором я хочу получить доступ к списку из предыдущего класса:

 class History extends StatefulWidget {
  @override
  _HistoryState createState() => _HistoryState();
}

class _HistoryState extends State<History> {

  List<Log> items = [] // i want it here
  
  @override
  Widget build(BuildContext context) {
    return Scaffold();

  }
}
  

Возможно ли это?

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

Спасибо.

Комментарии:

1. Если вы используете Provider, то перенесите класс, в котором у вас есть нижняя панель навигации, в provider, а затем вы можете прослушать его из любого дочернего элемента, который вы хотите, а также вы можете обновить данные и вызвать notifyListener

2. самым простым подходом было бы создать новый класс, например class Logs, содержащий статический список журналов с методами для работы со списком, но я также рекомендую Provider: pub.dev/packages/provider

Ответ №1:

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

Ваш провайдер будет выглядеть так:

 
import 'package:flutter/material.dart';

class LogProvider extends ChangeNotifier{
  List<Log> _logList =
      List<Log>();

  List<Log> get logList =>
      this._logList;

  set logList(List<Log> value) {
    _logList = value;
    notifyListeners();
  }


}

  

Комментарии:

1. Привет, большое спасибо за ваш ответ, теперь я немного лучше понимаю поставщиков и их важность. Однако у меня есть небольшая проблема. Я попытался реализовать это, используя ссылки, которые вы дали, список обновляется, однако, когда я переключаюсь на другой экран и обратно, список сбрасывается обратно в пустое состояние. Код для класса LogProvider, в который я добавил дополнительный метод add, и виджет находится по этой ссылке, mystb.in/ScreenSkatingAcid.scala

2. Вы используете ненужный метод getList() в вашем провайдере. Вызывая logList, вы можете получить список. Вы должны удалить getList() у провайдера и вызвать его так: provider.getList[index] .

3. Я сделал это, но все равно это то же самое, при переключении экранов данные из списка теряются. Может быть, я запутался в том, как я должен добавлять в список?

4. Можете ли вы добавить сюда свою страницу безопасности? mystb.in/ScreenSkatingAcid.scala

5. Я добавил его в конец этой ссылки. Я удалил некоторые другие виджеты, потому что они были слишком длинными. mystb.in/PotentialSallyBegan.scala Тем не менее, я оставил кнопку, при нажатии на которую она добавляет значение в список в классе LogProvider.