我正在使用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,因为这已经解决了他们的问题,所以我尝试做同样的,但它不适合我。
4条答案
按热度按时间sigwle7e1#
使用Getx离开页面时,根据路由解决方案使用以下选项之一:
或
这将从导航堆栈中删除当前页面,因此当重新进入该页面时,错误
Duplicate GlobalKey detected in widget tree
应该会永久消失。资料来源:
https://github.com/jonataslaw/getx/blob/master/documentation/en_US/route_management.md
t1rydlwq2#
问题解决了。我做了以下操作,以防其他人也面临这个问题。我声明了键为private,并将变量从final更改为。
根据我读到的很多答案,关键是UI层,所以不应该在控制器中声明。
oxiaedzo3#
只需更改每个小工具的窗体键即可。例如:第一个widget使用
globalFormKey1
,第二个widget使用GlobalFormKey2
,这样不会给予重复的错误。eimct9ow4#
从键变量中移除static和final类型,以便
静态最终全局密钥_abcKey =全局密钥();
更改为
全局密钥_abc密钥=全局密钥();