RxDart:验证TextField双值

时间:2018-12-13 16:24:18

标签: flutter rxdart

我有一个启用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,我不知道该如何处理。当启用GPS时,我的集团也有一个Stream<double> currentLatitude(否则它会吐出Observable.empty()),我还不太清楚如何工作(可能是合并?)。我想当GPS启用后,我应该只能在控制器中设置文本。

1 个答案:

答案 0 :(得分: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中的控制器。