我有一个启用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启用后,我应该只能在控制器中设置文本。
答案 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中的控制器。