【发布时间】:2020-08-13 01:47:36
【问题描述】:
我刚刚开始了一个小的颤振项目。我在 suffixIcon 中有一个 onPressed 属性,并且 onPressed 本身在其中有一个 FutureBuilder 。 future 函数是异步的(我使用的是 geolocator 包),它返回设备的坐标。当用户按下 suffixIcon 但 TextFieldForm 没有被更新时,我想用这些坐标刷新 TextFieldForm 内容,尽管 onPressed 正在工作,因为我在函数中有一个打印来知道它是否正常工作。这是TextFormBuilder的代码,下面是完整的代码。任何帮助将不胜感激
TextFormField(
controller: myController,
decoration: InputDecoration(
prefixIcon: IconButton(
icon: Icon(Icons.location_searching),
onPressed:(){
FutureBuilder<String>(
future: _obtenerUbicacion(),
builder: (context, snapshot) {
if (snapshot.hasData) {
myController.text = snapshot.data;
} else if (snapshot.hasError) {
return Text("${snapshot.error}");
}
// By default, show a loading spinner.
return CircularProgressIndicator();
},
);
}
,
),
hintText: 'Ingrese su ubicación',
),
validator: (value) {
if (value.isEmpty) {
return 'Por favor ingrese su ubicación';
}
return null;
},
),
这是App的完整代码
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:convert';
import 'package:geolocator/geolocator.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(primaryColor: Colors.deepOrangeAccent[100]),
home: Localizador());
}
}
class Localizador extends StatefulWidget {
@override
_LocalizadorState createState() => _LocalizadorState();
}
class _LocalizadorState extends State<Localizador> {
final _formKey = GlobalKey<FormState>();
Future<Serviciabilidad> futureServiciabilidad;
final myController = TextEditingController();
@override
Widget _coordenadas() {
return Padding(
padding: const EdgeInsets.all(15.0),
child: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
TextFormField(
controller: myController,
decoration: InputDecoration(
prefixIcon: IconButton(
icon: Icon(Icons.location_searching),
onPressed:(){
FutureBuilder<String>(
future: _obtenerUbicacion(),
builder: (context, snapshot) {
if (snapshot.hasData) {
myController.text = snapshot.data;
} else if (snapshot.hasError) {
return Text("${snapshot.error}");
}
// By default, show a loading spinner.
return CircularProgressIndicator();
},
);
}
,
),
hintText: 'Ingrese su ubicación',
),
validator: (value) {
if (value.isEmpty) {
return 'Por favor ingrese su ubicación';
}
return null;
},
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 16.0),
child: RaisedButton(
onPressed: () {
// Validate will return true if the form is valid, or false if
// the form is invalid.
if (_formKey.currentState.validate()) {
futureServiciabilidad = obtenerServiciabilidad();
}
},
child: Text('Enviar'),
),
),
],
),
),
);
}
Widget build(BuildContext context) {
return Scaffold(appBar: AppBar(title: Text('MyAPP')), body: _coordenadas());
}
}
Future<String> _obtenerUbicacion() async {
Position position = await Geolocator()
.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
//print(position.toString());
String pos = (position.latitude.toString())+ " " + (position.longitude.toString());
print(pos);
return pos;
}
【问题讨论】:
标签: flutter