Метод didChangeDependencies
Метод didChangeDependencies класса State срабатывает после initState и при каждом изменении наследуемых данных через dependOnInheritedWidgetOfExactType. Здесь безопасно читать Theme и MediaQuery.
Синтаксис
@override
void didChangeDependencies()
Пример
Давайте сохраним цвет темы в didChangeDependencies:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.green)),
home: Scaffold(
body: Center(
child: ThemeEcho(),
),
),
),
);
}
class ThemeEcho extends StatefulWidget
{
const ThemeEcho({super.key});
@override
State<ThemeEcho> createState() => _ThemeEchoState();
}
class _ThemeEchoState extends State<ThemeEcho>
{
Color? saved;
@override
void didChangeDependencies()
{
super.didChangeDependencies();
saved = Theme.of(context).colorScheme.primary;
}
@override
Widget build(BuildContext context)
{
return Text('abcde', style: TextStyle(color: saved));
}
}
На экране текст 'abcde' окрасится цветом, прочитанным в didChangeDependencies.
Пример
Давайте обновим подпись при смене локали:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: LocaleLabel(),
),
),
),
);
}
class LocaleLabel extends StatefulWidget
{
const LocaleLabel({super.key});
@override
State<LocaleLabel> createState() => _LocaleLabelState();
}
class _LocaleLabelState extends State<LocaleLabel>
{
String tag = '12345';
@override
void didChangeDependencies()
{
super.didChangeDependencies();
tag = Localizations.localeOf(context).toString();
}
@override
Widget build(BuildContext context)
{
return Text(tag);
}
}
На экране didChangeDependencies подставит код локали вместо '12345'.
Смотрите также
-
метод
initState,
который вызывается доdidChangeDependencies -
класс
InheritedWidget,
чьи изменения запускаютdidChangeDependencies -
метод
dependOnInheritedWidgetOfExactType,
который регистрирует зависимость от предка -
класс
BuildContext,
который доступен как context вState