На самом деле вам придется использовать вложенные Navigator
, когда у вас есть суб-навигационный поток или внутреннее путешествие. Пожалуйста, ознакомьтесь с документами о наложении навигаторов .
Однако, чтобы получить доступ к корневому навигатору, вы можете рекурсивно искать родителя Navigator
из текущего Navigator
и возвращать текущий Navigator
, когда у него нет родителя Navigator
.
Пример:
NavigatorState getRootNavigator(BuildContext context) {
final NavigatorState state = Navigator.of(context);
try {
return getRootNavigator(state.context);
} catch (e) {
return state;
}
}
//use it from any widget like
getRootNavigator(context);
РЕДАКТИРОВАТЬ:
Решение 1:
К получить конкретного родителя Navigator
, я могу подумать о расширении текущего класса Navigator
, чтобы принять id
и найти Navigator
по id
. Примерно так:
class NavigatorWithId extends Navigator {
const NavigatorWithId(
{Key key,
@required this.id,
String initialRoute,
@required RouteFactory onGenerateRoute,
RouteFactory onUnknownRoute,
List observers = const []})
: assert(onGenerateRoute != null),
assert(id != null),
super(
key: key,
initialRoute: initialRoute,
onGenerateRoute: onGenerateRoute,
onUnknownRoute: onUnknownRoute,
observers: observers,
);
// when id is null, the `of` function returns top most navigator
final int id;
static NavigatorState of(BuildContext context, {int id, ValueKey key}) {
final NavigatorState state = Navigator.of(
context,
rootNavigator: id == null,
);
if (state.widget is NavigatorWithId) {
// ignore: avoid_as
if ((state.widget as NavigatorWithId).id == id) {
return state;
} else {
return of(state.context, id: id);
}
}
return state;
}
}
Используйте NavigatorWithId
вместо Navigator
всякий раз, когда требуется, например,
return NavigatorWithId(
id: 1,
initialRoute: '/',
onGenerateRoute: (_) =>
MaterialPageRoute(builder: (_) => const YourPage()),
)
, а затем обращайтесь к нему, как:
NavigatorWithId.of(context, id: 1)
[1142 ] Решение 2:
Передайте ValueKey
навигатору и создайте вспомогательную функцию, которая бы соответствовала клавише и вернула требуемый Navigator
.
Функция что-то вроде
NavigatorState getNavigator(BuildContext context, {bool rootNavigator = false, ValueKey key}) {
assert(rootNavigator != null);
final NavigatorState state = Navigator.of(
context,
rootNavigator: rootNavigator,
);
if (rootNavigator) {
return state;
} else if (state.widget.key == key) {
return state;
}
try {
return getNavigator(state.context, key: key);
} catch (e) {
return state;
}
}
Используйте
return Navigator(
key: const ValueKey('Navigator1'),
initialRoute: '/',
onGenerateRoute: (_) =>
MaterialPageRoute(builder: (_) => const RootPage()),
);
и получите доступ к ней, как
getNavigator(context, key: const ValueKey('Navigator1'))
Недостаток этого метода я вижу не все типы ключей будут поддерживаться.
Примечание. Я не претендую на то, чтобы какое-либо из приведенных выше решений было наилучшим или оптимальным. Это несколько методов, которые я придумал. Если кто-то может предложить лучший подход, я стремлюсь учиться:)
Надеюсь, это поможет!
Вы пытались отформатировать весь столбец как столбец даты? Примерно так:
Range rg = (Excel.Range)worksheetobject.Cells[1,1];
rg.EntireColumn.NumberFormat = "MM/DD/YYYY";
Еще вы могли бы попробовать поставить одну галочку перед строковым выражением перед загрузкой текста в ячейку Excel (не уверен, имеет ли это значение или нет, но это работает при вводе текста непосредственно в ячейку ).
Попробуйте это решение в моей работе softwarew очень хорошо:
if (obj != null)
{
if (obj is DateTime)
{
if (DateTime.MinValue == ((DateTime)obj))
{
xlWorkSheet.Cells[x,y] = String.Empty;
}
else
{
dynamic opp = ((DateTime)obj);
xlWorkSheet.Cells[x,y] = (DateTime)opp;
}
}
}
Попробуйте использовать
DateTime.ToOADate()
И поместите это как двойное значение в ячейку. Могут возникнуть проблемы с Excel в системах Mac (он использует другое преобразование даты и времени -> двойное преобразование), но в большинстве случаев он должен работать хорошо.
Надеюсь, это поможет.