#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.