Flutter:多个小部件使用了相同的GlobalKey

时间:2020-06-11 13:27:08

标签: flutter dart flutter-layout

运行此代码时,出现错误:Multiple widgets used the same GlobalKey. 因此,我可以解决此问题。 如何将键动态传递给listview.Builder。有可能通过吗?这是我的代码的简化版本:


  GlobalKey<AutoCompleteTextFieldState<String>> key0 = new GlobalKey();

  @override
  Widget build(BuildContext context) {
    return M Scaffold(
        appBar: appBar,
        body: SingleChildScrollView(
          child: Container(
            child: ListView.builder(
               itemCount: 3,
               itemBuilder: (context, index) {
                return  SimpleAutoCompleteTextField(
                  key: key0,
                  suggestions: suggestions,
                  textChanged: (text) => print(text),
                  clearOnSubmit: false,
                  textSubmitted: (text) => print(text)
                ),
              }
            ),
          ),
        ),

    );
  }

2 个答案:

答案 0 :(得分:0)

将索引作为您的值

  key: ValueKey(index),

答案 1 :(得分:0)

GlobalKey在整个应用程序中必须唯一。

您不能在树中同时包含具有相同全局密钥的两个小部件。尝试这样做将在运行时声明。

这意味着多个元素不能使用同一键。这是short video about keys in Flutter,而不是简短的article about using keys,包括uint8_t(uint8_t)

在这种情况下,您应该从每个元素的唯一定义特征(例如内容或某些ID)派生其键。

注意事项:

    1。
GlobalKey

这意味着您不必在构建函数之外创建Key('AAA') == Key('AAA'); // true 对象,并且可以使用:

Key

或更确切地说是return SimpleAutoCompleteTextField( key: Key(itemId), ValueKey

  1. ValueKey(itemData)比较昂贵,如果您不需要明确地将它们从应用程序的一个位置移动到另一个位置,则建议使用常规的GlobalKey

    li>
  2. 不从索引派生键。这种做法被认为是不好的做法,因为当您尝试对同一子树中的现有小部件进行重新排序时,它将导致行为不当。