#flutter #dart
#flutter #dart
Вопрос:
Я хотел бы динамически устанавливать дочерний виджет определенного контейнера с помощью кода Dart, в частности, при нажатии кнопки. С чего мне начать, чтобы выполнить это? Я уже исследовал использование просмотра страницы, но это не совсем то, что я ищу.
Если бы я занимался веб-разработкой, я бы легко мог редактировать элемент по его идентификатору. Существует ли эквивалент Flutter идентификаторов HTML? Контроллеры кажутся здесь ограничивающими.
Ответ №1:
Flutter на самом деле так не работает. Flutter, как и React, является декларативной средой, в отличие от императивной среды. Деревья виджетов строятся из состояния, и поэтому виджет, расположенный выше в дереве, не знает и даже не заботится о своих дочерних элементах.
https://flutter.dev/docs/get-started/flutter-for/declarative
Комментарии:
1. Спасибо, это кое-что проясняет. В таком случае — каковы мои варианты с точки зрения достижения чего-то подобного? Это должно быть возможно, потому что я определенно видел и использовал приложения, у которых есть постоянная панель навигации.
2. Вам нужно спланировать, где находится ваше состояние в иерархии. Вы можете «детализировать» состояние в дереве, передав его дочерним элементам, или вы можете «добраться» до состояния с помощью
BuildContext
usingInheritedWidget
s и множества других удобных инструментов, таких какProvider
. Попробуйте выполнить этот пример. flutter.dev/docs/development/data-and-backend/state-mgmt/simple
Ответ №2:
Попробуйте это
class MyHomePage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _MyHomePageState();
}
}
class _MyHomePageState extends State<MyHomePage> {
Widget _dynamicWidget = FlutterLogo();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
_dynamicWidget,
FlatButton(
onPressed: () {
setState(() {
_dynamicWidget = Container(
color: Colors.red,
width: 50,
height: 50,
);
});
},
child: Text('Change')),
],
),
),
);
}
}