Решение на самом деле было довольно странным, и спасибо вам, Игорь за то, что помог мне в правильном направлении.
Итак, я изменил свои выходные типы с List<T>
на IEnumerable<T>
без каких-либо серьезных раздутий в моем коде мой конечный интерфейс выглядел примерно так:
public interface ITable<out T> where T : IEntity {
string TableName { get; set; }
Database CurrentDatabase { get; set; }
T New();
T Get(ulong id);
IEnumerable<T> GetAll();
void LoadAllStorageFiles(IEnumerable<IEntity> storage);
void StoreAllStorageFiles(IEnumerable<IEntity> storage);
void LoadRelated(IEntity current);
void LoadRelated(IEnumerable<IEntity> current);
}
Когда я отделил свои методы Коварианта и инвариантные, первоначально контравариантные, методы на разные типы интерфейсов, ковариант бросил бы и контравариант стал бы null во время трансляции.
Вот что странно, это мои оригинальные контравариантные методы:
void LoadAllStorageFiles(IEnumerable<T> storage);
void StoreAllStorageFiles(IEnumerable<T> storage);
void LoadRelated(T current);
void LoadRelated(IEnumerable<T> current);
Теперь вы думаете, что сделать типизацию более строгой, чтобы принимать только тот же общий тип, что и остальные из таблицы будет иметь скрытый смысл. В этом случае, однако, во время выполнения это считается контравариантным, и среда выполнения просто сдается и дает вам null без исключения. В этом случае, делая параметры LoadRelated и т. Д. IEntity, а не T, независимо от того, как Twilight Zone'ish в том, что вы теперь сделали его менее строгим, потому что теперь параметр открылся для любой IEntity, что, кажется, я считаю указывают на то, что, возможно, какое-то исключение должно быть сделано гипотетически для среды выполнения в некоторых контравариантных случаях, но, возможно, потребуется больше кода, усилий и денег, чем это стоит для удовлетворения такой проблемы, удовлетворяет проверке среды выполнения, и вы можете двигаться без заминки.
Итак, я только замечаю здесь кого-то, кто сталкивается с этой ситуацией и немного пожимает плечами. Возможно, кто-то может пролить свет на комментарии.
Таким образом, вы хотите запретить вызов build()
вашей домашней страницы, когда она не видна. Вот что вы можете попробовать.
bool _isHomeVisible = true;
@override
Widget build(BuildContext context) {
return _isHomeVisible ? YourWidgetImplementation() : Container();
}
И перед тем, как перейти, сделайте это.
void _navigateToNewPage() {
_isHomeVisible = false; // going to new page, make it false
Navigator.push(...).then((_) {
_isHomeVisible = true; // coming back to home page, make it true
});
}