У меня есть небольшой проект на основе AngularDart , Redux и Sockets.io .
В этом проекте отображается тривиальный компонентсписок предметов.Список элементов отображается после того, как промежуточное ПО Redux запросило информацию из бэкэнда API.Все отлично работает, и у меня есть мой список предметов.
items_component.dart
:
import 'package:angular/angular.dart';
import 'package:p_web/src/models/item.dart';
import 'package:p_web/src/redux/app_actions.dart';
import 'package:p_web/src/redux/app_state.dart';
import 'package:redux/redux.dart';
@Component(
selector: "content",
templateUrl: "items_component.html",
directives: [
NgFor,
]
)
class ItemsComponent implements OnInit {
ItemsComponent(this._store);
final Store<AppState> _store;
List<Item> get items => _store.state.items;
@override
void ngOnInit() async {
// Asks the Redux middleware to fetch the data, after which is uses the
// response to create a new application state. (the usual redux dance).
_store.dispatch(MGetItems());
}
}
items_component.html
:
<ul>
<li *ngFor="let item of items">{{item.name}}</li>
</ul>
Теперь через сокеты.io, API-интерфейс иногда отправляет сообщение в проект AngularDart.В результате получения сообщения отправляется действие MGetItems
.Опять же, все работает, как ожидалось, и новая версия состояния приложения создается с новыми элементами из ответа.
Проблема заключается в том, что, хотя состояние приложения было изменено (путем создания нового - Redux)Dance), на этот раз компонент не перестраивается и список элементов не отражает изменений.Как будто Обнаружение изменений не происходит, и я не знаю почему.
Я боролся с этим в течение 3 дней безрезультатно.Есть ли что-то, что я делаю неправильно, или есть что-то еще, что я пропускаю.То, что я хочу, это просто, когда состояние приложения изменяется таким образом, что изменяет результат получения компонента, я хочу, чтобы указанный компонент обновлялся.
Вот редуктор, который отвечает за создание новоговерсия состояния приложения.
app_reducer.dart
import 'package:p_web/src/redux/app_actions.dart';
import 'package:p_web/src/redux/app_state.dart';
AppState appReducer(AppState state, action) {
if (action is RSetItems) {
return state.copyWith(
items: action.items
);
}
return state;
}
app_state.dart
:
import 'package:meta/meta.dart';
import 'package:p_web/src/models/item.dart';
@immutable
class AppState {
final List<Item> items;
AppState({
this.items
});
AppState copyWith({
List<Item> items,
}) {
return AppState(
items: items ?? this.items,
);
}
}