flutter 在小部件树中检测到重复的GlobalKey- GetX导航

a0zr77ik  于 2023-03-04  发布在  Flutter
关注(0)|答案(4)|浏览(381)

我正在使用GetX插件在页面之间导航。当我导航回具有文本输入字段的页面时,我得到“* 在小部件树中检测到重复的GlobalKey *”

主页

import 'package:flutter/material.dart';
import 'package:flutter_application_1/binding.dart';
import 'package:flutter_application_1/controller.dart';
import 'package:flutter_application_1/next.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart';

void main() async {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: 'Kids Game',
      debugShowCheckedModeBanner: false,
      home: const HomePage(),
      initialBinding: HomeBinding(),
      builder: EasyLoading.init(),
    );
  }
}

class HomePage extends GetView<HomeController> {
  const HomePage({Key? key}) : super(key: key);
  static final formKey = GlobalKey<FormState>();

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Column(
        children: [
          Form(
              key: formKey,
              child: TextFormField(
                textAlign: TextAlign.center,
                autocorrect: false,
                controller: controller.editCtrl,
              )),
          InkWell(
            onTap: () {
              Get.to(() => NextPage())
            },
            child: Text("Next"),
          )
        ],
      ),
    );
  }
}

下一页小工具

import 'package:flutter/material.dart';
import 'package:flutter_application_1/controller.dart';
import 'package:flutter_application_1/main.dart';
import 'package:get/get.dart';

class NextPage extends StatelessWidget {
  final homeCtrl = Get.find<HomeController>();
  NextPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Column(
          children: [
            Text("this is next page"),
            InkWell(
              onTap: () {
                Get.offAll(() => HomePage(), transition: Transition.downToUp);
              },
              child: const Text("Go Back"),
            ),
          ],
        ),
      ),
    );
  }
}

控制器.dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';

class HomeController extends GetxController {
  //GlobalKey<FormState> formKey = GlobalKey<FormState>();
  final editCtrl = TextEditingController();
}

具有约束力

import 'package:flutter_application_1/controller.dart';
import 'package:get/get.dart';

class HomeBinding implements Bindings {
  @override
  void dependencies() {
    Get.lazyPut(
      () => HomeController(),
    );
  }
}

当我导航到NextPage,然后返回到HomePage时,收到错误
在小工具树中检测到重复的GlobalKey。
我读了一些不同的帖子,人们建议使用静态与 formkey,因为这已经解决了他们的问题,所以我尝试做同样的,但它不适合我。

sigwle7e

sigwle7e1#

使用Getx离开页面时,根据路由解决方案使用以下选项之一:

Get.offAndToNamed('next_screen')

Get.off(NextScreen());

这将从导航堆栈中删除当前页面,因此当重新进入该页面时,错误Duplicate GlobalKey detected in widget tree应该会永久消失。
资料来源:
https://github.com/jonataslaw/getx/blob/master/documentation/en_US/route_management.md

t1rydlwq

t1rydlwq2#

问题解决了。我做了以下操作,以防其他人也面临这个问题。我声明了键为private,并将变量从final更改为。

GlobalKey<FormState> _formKey = GlobalKey<FormState>();

根据我读到的很多答案,关键是UI层,所以不应该在控制器中声明。

oxiaedzo

oxiaedzo3#

只需更改每个小工具的窗体键即可。例如:第一个widget使用globalFormKey1,第二个widget使用GlobalFormKey2,这样不会给予重复的错误。

eimct9ow

eimct9ow4#

从键变量中移除static和final类型,以便
静态最终全局密钥_abcKey =全局密钥();
更改为
全局密钥_abc密钥=全局密钥();

相关问题