【问题标题】:Flutter TextField not responding inside FutureBuilderFlutter TextField 在 FutureBuilder 中没有响应
【发布时间】:2021-05-24 21:25:16
【问题描述】:

我目前对 Flutter 感到困惑和困惑。

我有一个 FutureBuilder 如下:

  Widget initView(double width) {
    return Container(
      child: FutureBuilder(
        future: fetchVehicles(),
        builder:
            (BuildContext context, AsyncSnapshot<List<Vehicle>> snapShotData) {
          switch (snapShotData.connectionState) {
            case ConnectionState.waiting:
              return loadingView();
            case ConnectionState.done:
              return TextField();
            default:
              return loadingView();
          }
        },
      ),
    );
  }

而 fetchVehicles() 如下:

Future<List<Vehicle>> fetchVehicles() async {
    List<Vehicle>vehicles = await APIService.fetchVehicles();
    return vehicles;
  }

调用 future 时,会显示 Loading 指示器,然后当它完成时,最终会显示 TextField。

现在,我现在的困境是,当我点击 TextField 并想要开始输入 future 的那一刻开始重新执行,从而使加载器再次显示。

这让我无法在 TextField 中输入内容。

这真是令人沮丧。我从来没有看到这会发生。

有人请帮助我。我很困惑,因为我看不出这段代码有什么问题。

这就是我在日志中看到的全部内容:

I/HwSecImmHelper( 3644): mSecurityInputMethodService is null
W/IInputConnectionWrapper( 3644): beginBatchEdit on inactive InputConnection
W/IInputConnectionWrapper( 3644): getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper( 3644): getTextAfterCursor on inactive InputConnection
W/IInputConnectionWrapper( 3644): getSelectedText on inactive InputConnection
W/IInputConnectionWrapper( 3644): endBatchEdit on inactive InputConnection
W/IInputConnectionWrapper( 3644): beginBatchEdit on inactive InputConnection
W/IInputConnectionWrapper( 3644): endBatchEdit on inactive InputConnection

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    参考:https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html

    未来一定是更早获得的,例如在 State.initState、State.didUpdateWidget 或 State.didChangeDependencies 期间。构造 FutureBuilder 时,State.build 或 StatelessWidget.build 方法调用期间不得创建

    您的问题与此有关:

    如果future与FutureBuilder同时创建,那么每次FutureBuilder的parent被重建,异步任务都会重新启动。

    您将未来函数调用到 initState。未来函数只调用一次。

     Future<List<Vehicle>> futureVehicleList;
        @override
          void initState() {
           futureVehicleList=fetchVehicles();
            super.initState();
          }
        
        -----------
        
        Widget initView(double width) {
            return Container(
              child: FutureBuilder(
                future: futureVehicleList,
    

    【讨论】:

    • 谢谢哥们。这行得通。我仍然很惊讶为什么会这样。我讨厌说颤动很糟糕!洛兹。但是,我别无选择,考虑到它的平台覆盖率,它仍然无疑是最好的框架。
    • FutureBuilder 每次运行 'build' 函数时都会再次调用未来函数。由于打开键盘时“构建”函数会重新运行,因此在将来的函数中会再次调用它。可能的问题是通过添加脚手架'resizeToAvoidBottomInset: false'解决的,但是这次打开键盘时屏幕并没有根据键盘自动排列。
    【解决方案2】:

    问题不在于 Future Builder 。问题出在 textInputField 中。 如果您在 TextInputField 中使用 onChanged 方法。把它改成onFieldSubmitted:

    onFieldSubmitted: (String value) {
                 
                },
    

    您的不活跃问题将得到解决。

    【讨论】:

      猜你喜欢
      • 2021-06-06
      • 1970-01-01
      • 2020-05-24
      • 2020-12-12
      • 2021-09-06
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多