RxString 中传递的 Dropdown 的 setState() 中的数据值在 Flutter 中使用 Getx 显示空值

问题描述

我需要从第 1 页的文本字段和下拉菜单中获取输入并将其显示在另一个页面上。 文本工作正常,但下拉值显示为“空”。

截图 Page1 Page2

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:get/get_rx/src/rx_types/rx_types.dart';
import 'package:justpoll/Constants.dart';
import 'package:justpoll/screens/create_poll/create_poll2.dart';
import 'package:justpoll/widgets/custom_input.dart';

TextEditingController questionController,op1Controller,op2Controller,op3Controller,op4Controller;

String opemo1,opemo2,opemo3,opemo4;

class CreatePoll1 extends StatefulWidget {
  @override
  _CreatePollState createState() => _CreatePollState();
}

class _CreatePollState extends State<CreatePoll1> {
  final controller = Get.put(PollDataController());
  final _formKey = GlobalKey<FormState>();

  List<String> emoji = [
    "❤️","?","✌️",];

下拉代码:

 Padding(
                      padding: const EdgeInsets.only(right: 2.0),child: Row(
                        children: [
                          Expanded(
                            flex: 2,child: Padding(
                              padding: const EdgeInsets.only(right: 20),child: CustomInput(
                                textEditingController: op1Controller,labletext: 'Option 1*',decoration: InputDecoration(hintText: 'Option'),validator: (v) {
                                  if (v.trim().isEmpty)
                                    return 'Please enter something';
                                  return null;
                                },),Expanded(
                            flex: 1,child: Padding(
                              padding: const EdgeInsets.only(right: 30),child: Container(
                                padding: EdgeInsets.only(left: 10,right: 16),decoration: BoxDecoration(
                                    border: Border.all(
                                        color: MyColors.black,width: 1.5),borderRadius: BorderRadius.circular(10)),child: DropdownButton(
                                  hint: Text('❤️'),value: opemo1,icon: Icon(Icons.arrow_drop_down),iconSize: 36,isExpanded: true,underline: SizedBox(),style: TextType.regularDarkText,onChanged: (newValue) {
                                    setState(() {
                                      opemo1 = newValue;
                                    });
                                  },items: emoji.map((opemo1) {
                                    return DropdownMenuItem(
                                      value: opemo1,child: Text(opemo1),);
                                  }).toList(),],

GetX 控制器:

DropDownMenu 的值用于 RxString 传递数据。

class PollDataController extends GetxController {
  RxString question = ''.obs;
  RxString op1 = ''.obs;
  RxString op2 = ''.obs;
  RxString op3 = ''.obs;
  RxString op4 = ''.obs;
  RxString op1Emoji = '$opemo1'.obs;
  RxString op2Emoji = ''.obs;
  RxString op3Emoji = ''.obs;
  RxString op4Emoji = ''.obs;

  
  @override
  void onInit() {
    super.onInit();
    questionController = TextEditingController();
    questionController.addListener(() {
      question.value = questionController
          .text; // the RxString is automatically updated with whatever is input in the textfield
    });
    op1Controller = TextEditingController();
    op1Controller.addListener(() {
      op1.value = op1Controller
          .text; // the RxString is automatically updated with whatever is input in the textfield
    });
    op2Controller = TextEditingController();
    op2Controller.addListener(() {
      op2.value = op2Controller
          .text; // the RxString is automatically updated with whatever is input in the textfield
    });
    op3Controller = TextEditingController();
    op3Controller.addListener(() {
      op3.value = op3Controller
          .text; // the RxString is automatically updated with whatever is input in the textfield
    });
    op4Controller = TextEditingController();
    op4Controller.addListener(() {
      op4.value = op4Controller
          .text; // the RxString is automatically updated with whatever is input in the textfield
    });
  }

  @override
  void onClose() {
    super.onClose();
    questionController.dispose();
    op1Controller.dispose();
    op2Controller.dispose();
    op3Controller.dispose();
    op4Controller.dispose();
  }
}

下一页显示代码:

                          Padding(
                                padding:
                                    const EdgeInsets.only(left: 10,top: 20),child: Obx(
                                  () => Text(pollDataController.op1Emoji.value),

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)