Мне нужно использовать Theme.of(context) во время выполнения по причинам: я хочу, чтобы изменение произошло, когда приложение рисуется/отрисовывается/монтируется в первый раз. Поэтому я хочу использовать что-то вроде useLayoutEffect(() => {}, []) в реакции.
initState дает мне контекст, но я не могу использовать Theme.of(context) в нем, что, как я полагаю, связано с тем, что у меня пока нет доступа к context.inheritFromWidgetOfExactType. Поправьте меня, если я ошибаюсь, но я предполагаю, что поскольку вы наследуете тему от последнего родителя, определяющего тему, поэтому она подпадает под категорию inheritFromWidgetOfExactType.
Я посмотрел addPostFrameCallback, но он все еще отображает 1 кадр перед вызовом моего метода.
Итак, порядок такой: initState -> DidChangeDependancies -> Build (1 кадр) -> эффекты postFrameCallback.
Итак, я написал свой код следующим образом:
late Color x;
var firstRender = true;
late BuildContext myContext;
void initState() {
super()
SchedulerBinding.instance.addPostFrameCallback((_) {
setState(() {
firstRender = false;
});
print(Theme.of(context).colorScheme.primaryColor;
}
Widget build(BuildContext context){
if (firstRender){
return Container();
}
return MyFullWidget;
}
}
Это работает, но я хотел проверить, не является ли это антипаттерном? есть ли лучший способ сделать это, есть ли что-нибудь вроде addPreFrameCallback?
Потому что это может срабатывать несколько раз, когда зависимости меняются, да? Но я точно знаю, что мой обратный вызов нужно запустить только один раз (ну, пока моя тема не меняется, но я не меняю тему)
Если есть решение, в котором вы можете использовать DidChangeDep, но оно срабатывает только при изменении определенных зависимостей, например Theme, тогда это было бы идеально.





Собственно задача пока не ясна, но почему бы не сделать так?
bool _wasCallbackThatNeedToBeFiredOnceCalled = false;
@override
void didChangeDependencies() {
if (!_wasCallbackThatNeedToBeFiredOnceCalled) {
_callbackThatNeedToBeFiredOnce();
_wasCallbackThatNeedToBeFiredOnceCalled = true;
}
}
да, это другой подход, гораздо лучший, чем мой. Но даже в этом случае метод DidChangeDependency будет срабатывать при каждом изменении зависимости, а затем вы запускаете этот оператор if. Я хотел посмотреть, возможно ли запустить его ТОЛЬКО при одном изменении зависимости. Например, как в реакции можно указать зависимости в массиве зависимостей. Просто потому, что это выглядит чище. Но да, это выглядит намного чище, чем возвращение пустого контейнера в сборку. Спасибо. Просто из любопытства, нет ли возможности сделать обратный вызов в preFrameCallback.
Такого метода нет. Это Flutter, а не React. :) Здесь используется другой подход. В чем причина вашего вопроса?
хаха, достаточно справедливо. Итак, чего я пытался добиться, так это изменить цвет фона различных кнопок на ToggleButton. Если выбрана первая кнопка, я хочу, чтобы она имела основной цвет, но если выбрана вторая кнопка, я хочу, чтобы она имела третичный цвет. Итак, я создал объект, в котором хранятся theme.of(context).colorScheme.primaryColor и secondaryColor, а затем внутри onPressed я меняю fillColor. Хотя я могу использовать theme.of(context) внутри самого onPressed, потому что сборка имеет полный контекст. Просто из чистого любопытства я хотел посмотреть, можно ли использовать контекст вне сборки.
Подходит ли вам этот образец: gist.github.com/bambinoua/be4f234aabd983d4abf17406e43be56f?
Да, это так, спасибо. Раньше не видел ValueListenableBuilder. Поэтому мне нужно было сначала это понять. Спасибо
Итак, прочитайте метод
Theme.of(context)вdidChangeDependancies. В чем проблема?