Чтобы отправить параметры виджету с сохранением состояния во Flutter, вы можете использовать конструктор класса виджета и передать необходимые параметры при создании экземпляра виджета. Вот несколько методов с примерами кода:
Метод 1: Параметры конструктора
Вы можете определить параметры в конструкторе виджета с отслеживанием состояния и использовать их для инициализации состояния виджета. Вот пример:
class MyWidget extends StatefulWidget {
final String title;
MyWidget({required this.title});
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
@override
Widget build(BuildContext context) {
return Text(widget.title);
}
}
В этом примере класс MyWidgetпринимает в своем конструкторе параметр title. Внутри метода buildсостояния вы можете получить доступ к параметру title, используя widget.title.
Метод 2: параметры именованных маршрутов
Если вы используете именованные маршруты для навигации между экранами, вы можете передавать параметры с помощью свойства ModalRoute.of(context)?.settings.arguments. Вот пример:
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
@override
Widget build(BuildContext context) {
final String? title = ModalRoute.of(context)?.settings.arguments as String?;
return Text(title ?? '');
}
}
В этом примере класс MyWidgetне имеет параметров конструктора. Вместо этого он получает параметр titleиз настроек маршрута, используя ModalRoute.of(context)?.settings.arguments.
Метод 3: InheritedWidget/InheritedModel
Если вы хотите совместно использовать данные между несколькими виджетами в дереве виджетов, вы можете использовать InheritedWidgetили InheritedModel. Эти виджеты позволяют передавать данные вниз по дереву виджетов без явной передачи их в качестве параметров каждому виджету. Вот упрощенный пример:
class MyData extends InheritedWidget {
final String title;
MyData({required this.title, required Widget child}) : super(child: child);
static MyData? of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<MyData>();
}
@override
bool updateShouldNotify(MyData oldWidget) {
return title != oldWidget.title;
}
}
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
@override
Widget build(BuildContext context) {
final myData = MyData.of(context);
return Text(myData?.title ?? '');
}
}
В этом примере класс MyDataпредставляет собой InheritedWidget, который содержит параметр title. Класс MyWidgetможет получить доступ к title, вызвав MyData.of(context).