【问题标题】:NoSuchMethodError : '[]' in flutterNoSuchMethodError : \'[]\' 在颤动
【发布时间】:2023-01-07 15:07:48
【问题描述】:

我正在研究 flutter,我已经覆盖了 initState() 和覆盖了 Widget build() 因此,当我在覆盖的 initState() 中为变量赋值并在覆盖的 Widget build() 中使用该变量时,我将变量设置为 null。有人请帮助我

dynamic database_functions = FirebaseMethods();

class RenderProfileView extends StatefulWidget {
  String email;
  RenderProfileView(this.email, {super.key});

  @override
  State<RenderProfileView> createState() => _RenderProfileViewState();
}

class _RenderProfileViewState extends State<RenderProfileView> {
  TextEditingController name_controller = TextEditingController();
  TextEditingController phone_number_controller = TextEditingController();

  dynamic? user_json;  // this is the variable i am assigning value inside initState()

  String name = "";
  String phone_number = "";
  dynamic edit_or_display_name = ProfileName();
  dynamic edit_or_display_phone_number = ProfilePhoneNumber();
  dynamic edit_or_save_icon = Icons.edit;
  dynamic edit_or_save_text = "Edit";
  String error_message = "";

  @override
  void initState() {
    super.initState();
    getUserData();
  }

  void getUserData() {
    database_functions.findUsers('email', widget.email).then((value) {
      setState(() {
        print(value);  // this line not executing before the print statement that i have given in the Widget build()
        user_json = value;
        name = value[0].name;
        phone_number = value[0].phone;
      });
    });
  }

  dynamic get_name() {
    return name_controller.text;
  }

  void clear_name() {
    name_controller.text = "";
  }

  dynamic get_phone_number() {
    return phone_number_controller.text;
  }

  void clear_phone_number() {
    phone_number_controller.text = "";
  }

  void changer() {
    setState(() {
      if (edit_or_display_name.runtimeType == NameField) {
        String newName = get_name();
        String newPhoneNumber = get_phone_number();
        if (name_validator(newName) == true && phone_number_validator(newPhoneNumber) == true) {
          name = newName;
          phone_number = newPhoneNumber;
          clear_name();
          clear_phone_number();
          edit_or_display_name = ProfileName();
          edit_or_display_phone_number = ProfilePhoneNumber();
          edit_or_save_icon = Icons.edit;
          edit_or_save_text = "Edit";
          error_message = "";
        } else {
          if (name_validator(newName) == false) {
            error_message = "Invalid format for name!";
          } else {
            error_message = "Invalid format for phone number!";
          }
        }
      } else {
        edit_or_display_name = NameField(name_controller, get_name, clear_name);
        edit_or_display_phone_number = PhoneNumberField(phone_number_controller, get_phone_number, clear_phone_number);
        edit_or_save_icon = Icons.save;
        edit_or_save_text = "Save";
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    print(user_json);  // this is giving me null
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Profile'),
          actions: <Widget>[
            TextButton(
              style: flatButtonStyle,
              onPressed: () => changer(),
              child: IconTextPair(edit_or_save_icon, edit_or_save_text, Colors.white,),
            ),
          ],
          backgroundColor: Colors.blue,
          foregroundColor: Colors.white,
        ),
        backgroundColor: Colors.white,
        body: ProfilePage(name, widget.email, user_json[0]['rollno'], phone_number, user_json[0].batch, user_json[0].dept, user_json[0].gender, ["a", "b", "c", "d"], user_json[0].photoImgLink, edit_or_display_name, edit_or_display_phone_number, error_message),  // this line gives me the following error : Error: NoSuchMethodError: '[]'
      ),
    );
  }
}

这是我的 firebase 函数类

class FirebaseMethods {
  Future<List> findEvents(dynamic attribute, dynamic value) async {
    CollectionReference eventCollection =
        FirebaseFirestore.instance.collection('events');
    return eventCollection
        .where(attribute, isEqualTo: value)
        .get()
        .then((QuerySnapshot querySnapshot) {
      List events = [];
      querySnapshot.docs.forEach((doc) {
        events.add(doc.data());
      });
      return events;
    }).catchError((error) {
      print("Failed to retrieve events: $error");
    });
  }

  Future<List> findUsers(dynamic attribute, dynamic value) async {
    CollectionReference userCollection =
        FirebaseFirestore.instance.collection('profile');
    return userCollection
        .where(attribute, isEqualTo: value)
        .get()
        .then((QuerySnapshot querySnapshot) {
      List users = [];
      querySnapshot.docs.forEach((doc) {
        users.add(doc.data());
      });
      return users;
    }).catchError((error) {
      print("Failed to retrieve users: $error");
    });
  }
}

有人请帮助我

【问题讨论】:

  • 你能发布错误吗?

标签: flutter dart overriding


【解决方案1】:

小部件的build方法可能会在设置user_json之前被调用,因为getUserData被调用了。

您应该处理user_json == null 的情况,例如显示加载视图。

【讨论】:

    【解决方案2】:

    使用 setState 是一个巨大的错误。只需将其从 getUserData 中删除即可。错误是试图在 initState 方法中执行 setState。其次,为什么你会变得空。因为获取数据需要一些时间。换句话说,它是异步的。所以你需要在它返回一些数据后打印它。

    【讨论】:

      【解决方案3】:

      您正在调用返回 Future 的 firebase 函数。所以最初直到你得到结果它不会更新值&你的构建将尝试在更新之前访问变量。

      您可以尝试在 Scaffold 的主体中使用 FutureBuilder 来解决这个问题。

      body: FutureBuilder<String>(
          future: findUsers('email', widget.email),
          builder: (
            BuildContext context,
            AsyncSnapshot<String> snapshot,
          ) {
            // You can check the state of future before rendering widgets
            if (snapshot.connectionState == ConnectionState.waiting) {
              return CircularProgressIndicator();
            } else if (snapshot.connectionState == ConnectionState.done) {
              if (snapshot.hasError) {
                return const Text('Error');
              } else if (snapshot.hasData) {
            // Here in snapshot.data you will not get the list of users
                const userList = snapshot.data as List; 
                return ProfilePage(name, widget.email, userList[0]['rollno'], phone_number, userList[0].batch, userList[0].dept, userList[0].gender, ["a", "b", "c", "d"], userList[0].photoImgLink, edit_or_display_name, edit_or_display_phone_number, error_message);
              } else {
                return const Text('Empty data');
              }
            } else {
              return Text('State: ${snapshot.connectionState}');
            }
          },
        )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-14
        • 1970-01-01
        • 2020-10-14
        • 1970-01-01
        • 2021-09-08
        • 1970-01-01
        • 2020-09-21
        • 1970-01-01
        相关资源
        最近更新 更多