繁体   English   中英

如何从 Hero 小部件调用提供程序 - Flutter

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM