[英]Flutter: Hero widget, Navigation 2.0 and Provider are not working properly together
[英]How to call a provider from a Hero widget - Flutter
我正在将输入表单从我的“主页”小部件转移到弹出卡(以 Hero 小部件打开)。 该表单中的“下拉”框之一包含在 FireBase 数据库中注册的用户名。
在传输之前,forms 工作正常。 但是,之后,当我单击打开弹出卡的按钮时,应用程序冻结并出现此错误:
此处主要小部件/流提供程序的代码:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
runApp(const Hyttekos());
}
class Hyttekos extends StatelessWidget {
const Hyttekos({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return StreamProvider<MyUser?>.value(
initialData: null,
value: AuthService().user,
child: const MaterialApp(
home: Wrapper(),
),
);
}
}
小部件的代码如下所示:
class addActivityPopupCard extends StatefulWidget {
List<String> membersToShow = [];
addActivityPopupCard({required this.membersToShow});
@override
State<addActivityPopupCard> createState() => _addActivityPopupCardState();
}
class _addActivityPopupCardState extends State<addActivityPopupCard> {
dynamic _dropDownActivity;
String? _dropDownMember;
List<String> activities = [
"Pil og Boge",
"Politisk Ukorrekt",
"Kortspel",
];
@override
Widget build(BuildContext context) {
var board = Provider.of<List<MyUser?>>(context);
List<MyUser?> members = [];
for (var user in board) {
members.add(user);
}
return Center(
child: Padding(
padding: const EdgeInsets.all(32.0),
child: Hero(
tag: _heroAddTag,
createRectTween: (begin, end) {
return RectTween(begin: begin, end: end);
},
child: Material(
color: Colors.white,
elevation: 2,
shape:
RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
DropdownButton<String>(
value: _dropDownActivity,
onChanged: _dropDownCallActivity,
items: activities.map((String value) {
return DropdownMenuItem(
value: value,
child: Text(value),
);
}).toList(),
),
// Members
Builder(builder: (context) {
return DropdownButton<String>(
value: _dropDownMember,
onChanged: _dropDownCallMember,
items: members.map((MyUser? value) {
return DropdownMenuItem(
value: value?.uid ?? "",
child: Text(value?.name ?? ""),
);
}).toList(),
);
}),
],
),
),
),
),
),
),
);
}
void _dropDownCallActivity(String? selectedValue) {
if (selectedValue is String) {
setState(() {
_dropDownActivity = selectedValue;
});
}
print(_dropDownActivity);
}
void _dropDownCallMember(String? selectedValue) {
if (selectedValue is String?) {
setState(() {
_dropDownMember = selectedValue;
});
}
print(_dropDownMember);
}
}
问题出在您的 Hyttekos class
阅读此链接以使用 stream 提供程序https://pub.dev/packages/streams_provider的正确格式
这必须看起来像这样
Widget build(BuildContext context) {
return StreamProvider<MyUser?>.value(
initialData: null,
value: AuthService().user,
builder: (context, child) {
// return widget here based on selector stream emits
},
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.