Следующий вопрос:
Мне удалось продвинуться намного дальше с моим приложением-калькулятором дозировки и процедурой управления состоянием, и теперь я пытаюсь масштабировать вещи визуально.
Поэтому я хотел изменить встроенный виджет на основе раскрывающегося меню, которое на самом деле работало нормально, но я пытаюсь реализовать AnimatedSwitcher, чтобы каждый раз, когда пользователь меняет раскрывающееся меню, старый виджет исчезал, а новый вместо просто переключение. Искал решения, нашел одно, но я не знаю, правильно ли я его реализовал, так как я не получаю ни анимации, ни сообщения об ошибке.
Я предполагаю, что либо использовал не того ребенка, либо что-то вроде уникального ключа отсутствует (что я не знаю, как реализовать)
Вот необходимые части моего кода:
Выпадающее меню:
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 12.0),
child:DropdownButtonHideUnderline(
child: DropdownButton<String>(
value: selectedItem,
onChanged: (String string) => setState(() {
streamController.sink.add(string);
return selectedItem = string;
}),
selectedItemBuilder: (BuildContext context) {
return items.map<Widget>((String item) {
return Text(item,
//style: TextStyle(fontWeight: FontWeight.bold),
textAlign: TextAlign.right,
);
}).toList();
},
items: items.map((String item) {
return DropdownMenuItem<String>(
child: Text('$item',
//style: TextStyle(fontWeight: FontWeight.bold),
textAlign: TextAlign.right,
),
value: item,
);
}).toList(),
),
),
);
}
}
StreamBuilder и AnimatedSwitcher:
StreamBuilder(
stream: streamController.stream,
builder: (context, snapshot) {
return AnimatedSwitcher(
duration: Duration(seconds: 1),
child: updateBestandteile(snapshot.data),
);
},
),
Пример условия:
Padding updateBestandteile(String i) {
switch (i) {
case "MMF":
{
return Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
height: 200,
decoration: BoxDecoration(
color: b,
borderRadius: BorderRadius.circular(10.0)
),
child: Align(
alignment: Alignment.center,
child: Row(
children: [
Column(
children: [
Text('Zu verwendende Präparate:',
style: TextStyle(fontWeight: FontWeight.bold)),
Text('Medetomidin 1mg/ml'),
Text('Midazolam 5mg/ml'),
Text('Fentanyl 0.5mg/ml'),
Text('NaCl 0,9%'),
],
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
),
Column(
children: [
Text('Anzumischende Menge:',
style: TextStyle(fontWeight: FontWeight.bold),
),
Text((MedetomidindosierungmgprokgKGW*selectedamount*selectedweight/(1000*Medetomidinmgproml)).toString()+"ml"),
Text((MidazolamdosierungmgprokgKGW*selectedamount*selectedweight/(1000*Midazolammgproml)).toString()+"ml"),
Text((FentanyldosierungmgprokgKGW*selectedamount*selectedweight/(1000*Fentanylmgproml)).toString()+"ml"),
Text((((MedetomidindosierungmgprokgKGW*selectedamount*selectedweight/(1000*Medetomidinmgproml))+(MidazolamdosierungmgprokgKGW*selectedamount*selectedweight/(1000*Midazolammgproml))+(FentanyldosierungmgprokgKGW*selectedamount*selectedweight/(1000*Fentanylmgproml)))*4).toString()+"ml"),
],
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
),
],
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
),
),
),
);
}
break;
Надеюсь, вы сможете помочь, как в прошлый раз :) Заранее спасибо! Ваше здоровье, п
Проблема может заключаться в том, что вы не устанавливаете ключ. Если новый дочерний виджет имеет тот же тип, что и старый тип виджета, то AnimatedSwitcher НЕ будет анимировать между ними, поскольку с точки зрения фреймворка они являются одним и тем же виджетом. Установите уникальный ValueKey для каждого дочернего виджета, который вы хотите анимировать.
Пожалуйста, обратитесь к Flutter Docs для AnimatedSwitcher и ознакомьтесь с видео AnimatedSwitcher Widget of the Week от Flutter Team.
Если «новый» дочерний элемент имеет тот же тип и ключ виджета, что и «старый» дочерний элемент, но с другими параметрами, то AnimatedSwitcher не сделает переход между ними, поскольку, что касается каркаса, это один и тот же виджет, и существующий виджет можно обновить с помощью новые параметры. Чтобы принудительно выполнить переход, установите ключ на каждый дочерний виджет, который вы хотите считать уникальным (обычно ValueKey в данных виджета, который отличает этот дочерний элемент от другие).
Пожалуйста, примите и лайкните мой ответ, если он помог вам решить вашу проблему. Спасибо и вам тоже хорошего дня!!!
Спасибо, это было решение! Мне просто нужно было добавить key:ValueKey(xy) к каждой опции, работает именно так, как я хотел :) Хорошего дня!