0

我有一个按钮启用 GPS。启用 GPS 时,TextField应使用纬度值填充。禁用时,用户应该能够输入纬度值。我需要验证用户提供的值(在 -90.0 到 90.0 的范围内)。

就像是:

StreamBuilder(
                stream: bloc.latitude,
                builder: (context, snapshot) {
                  return TextField(
                    keyboardType: TextInputType.number,
                    decoration: new InputDecoration(
                        hintText: 'Latitude',
                        labelText: 'Latitude',
                        errorText: snapshot.error),
                    onChanged: bloc.onLatitudeChanged,
                    //enabled: snapshot.hasData,
                    controller: _latitudeTextController,
                  );
                },
              ),

我的集团有:

final _latitudeController = BehaviorSubject<String>();
Function(String) get onLatitudeChanged => _latitudeController.sink.add;
Stream<String> get latitude => _latitudeController
                              .distinct()
                              .map((l) => double.parse(l))
                              .transform(validateLatitude) // double -> double
                              .map((l) => l.toString());

我有很多问题。如果map失败,我会得到一个FormatException并且我无法弄清楚如何处理它。我的集团也有一个 Stream<double> currentLatitude启用 GPS 的时间(否则它会吐出Observable.empty()),我不太清楚如何在其中工作(可能是合并?我认为启用 GPS 时我应该能够设置控制器中的文本。

4

1 回答 1

0

我认为在使用 Stream Builder 时,您只需要使用snapshot.hasData()snapshot.hasError()检查快照中的数据。这至少会解决 Observable.empty() 问题。对于 FormatException,您需要在 validate 函数中对此进行验证。希望这可以帮助!

可能是这样的

 final TextEditingController _controller = new TextEditingController();
    if (snapshot.hasData) {
      _controller.text = snapshot.data;
    } 

注意:将此 _controller 分配给 TextField 中的控制器。

于 2018-12-13T20:38:44.270 回答