Как определить, является ли маршрут текущим маршрутом в его методе сборки

Решение на самом деле было довольно странным, и спасибо вам, Игорь за то, что помог мне в правильном направлении.

Итак, я изменил свои выходные типы с 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, что, кажется, я считаю указывают на то, что, возможно, какое-то исключение должно быть сделано гипотетически для среды выполнения в некоторых контравариантных случаях, но, возможно, потребуется больше кода, усилий и денег, чем это стоит для удовлетворения такой проблемы, удовлетворяет проверке среды выполнения, и вы можете двигаться без заминки.

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

0
задан CopsOnRoad 19 January 2019 в 07:59
поделиться

1 ответ

Таким образом, вы хотите запретить вызов 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
  });
}
0
ответ дан CopsOnRoad 19 January 2019 в 07:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: