当我们通过TextField
在Flutter中设置TextEditingController
时,如下所示:
textEditingController = TextEditingController();
textEditingController.text = "Some value.";
我们知道这里的text
设置器会将TextSelection
设置为输入的开头,如以下代码所示:
set text(String newText) {
value = value.copyWith(
text: newText,
selection: const TextSelection.collapsed(offset: -1),
composing: TextRange.empty,
);
}
我的问题是我不想设置选择,因为在设置TextField
之后,我将焦点转移到了另一个字段上。
那么,有什么方法可以设置TextField
的值而不设置选择,或者在设置值后删除设置的选择?
谢谢。
答案 0 :(得分:0)
#import libraries
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from __future__ import print_function
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
from oauth2client.service_account import ServiceAccountCredentials
import datetime
import RPi.GPIO as GPIO,time
import Adafruit_DHT
import struct, time, serial, socket, requests
import json
#library for the MPPT Solar Charge Controller that was found on GitHub
import esmart
"""acquire spreadsheet ID at the URL of the spreadsheet
which are enclosed in *//* e.g https://docs.google.com
/spreadsheets/d/1KqWlsVCJgGjLFb7YKfrOnqHpl3n3BWGblOXsV22IGOQ/
edit#gid=0"""
#declaring spreadsheet ID
MY_SPREADSHEET_ID = '1KqWlsVCJgGjLFb7YKfrOnqHpl3n3BWGblOXsV22IGOQ'
#defining update_sheet function
def update_sheet(sheetname, pv_volt):
"""acquire .json file from setting up credentials by following
this tutorial: https://gspread.readthedocs.io/en/latest/oauth2.html#service-account"""
#authentication
SCOPES = 'https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive'
"""for the next line of code, enter the path of the file where the .json file was acquired from the above linked
tutorial e.g /home/pi/gspread/Hydroponics-0b1b25110de8.json *note: the .json file
can be placed anywhere as long as the path is declared as shown below*"""
creds = ServiceAccountCredentials.from_json_keyfile_name('/home/pi/hydroponicsmonitoring/Hydroponics-0b1b25110de8.json',SCOPES)
#authorization
service = build('sheets','v4', http=creds.authorize(Http()))
#call the sheets API, append the next row of sensor data
"""values" is the array of rows that we are updating, it is a single row"""
values = [[ str(datetime.datetime.now()), 'PV Voltage', pv_volt]]
body = {'values':values}
result = service.spreadsheets().values().append(
spreadsheetId=MY_SPREADSHEET_ID,
range=sheetname + '!A1:G1',
valueInputOption='USER_ENTERED',
insertDataOption='INSERT_ROWS',
body=body).execute()
STATE_START = 0
STATE_DATA = 1
REQUEST_MSG0 = b"\xaa\x01\x01\x01\x00\x03\x00\x00\x1e\x32"
LOAD_OFF = b"\xaa\x01\x01\x02\x04\x04\x01\x00\xfe\x13\x38"
LOAD_ON = b"\xaa\x01\x01\x02\x04\x04\x01\x00\xfd\x13\x39"
DEVICE_MODE = ["IDLE", "CC", "CV", "FLOAT", "STARTING"]
def __init__(self):
self.state = STATE_START
self.data = []
self.callback = False
self.port = ""
self.timeout = 0
def __del__(self):
self.close()
def set_callback(self, function):
self.callback = function
def open(self, port):
self.ser = serial.Serial(port,9600,timeout=0.1)
self.port = port
def send(self, pl):
self.ser.write(self.pack(pl))
def parse(self, data):
for c in data:
if (self.state == STATE_START):
if (c == 0xaa):
# Start character detected
self.state = STATE_DATA
self.data = []
self.target_len = 255
#else:
#print c
elif (self.state == STATE_DATA):
self.data.append(c)
# Received enough of the packet to determine length
if (len(self.data) == 5):
self.target_len = 6 + self.data[4]
# Received whole packet
if (len(self.data) == self.target_len):
self.state = STATE_START
#print " ".join("{:02x}".format(ord(c)) for c in self.data)
# Source 3 is MPPT device
if (self.data[2] == 3):
msg_type = self.data[3]
# Type 0 packet contains most data
if (self.data[3] == 0):
fields = {}
fields['chg_mode'] = int.from_bytes(self.data[7:9], byteorder='little')
fields['pv_volt'] = int.from_bytes(self.data[9:11], byteorder='little') / 10.0
fields['bat_volt'] = int.from_bytes(self.data[11:13], byteorder='little') / 10.0
fields['chg_cur'] = int.from_bytes(self.data[13:15], byteorder='little') / 10.0
fields['load_volt'] = int.from_bytes(self.data[17:19], byteorder='little') / 10.0
fields['load_cur'] = int.from_bytes(self.data[19:21], byteorder='little') / 10.0
fields['chg_power'] = int.from_bytes(self.data[21:23], byteorder='little')
fields['load_power'] = int.from_bytes(self.data[23:25], byteorder='little')
fields['bat_temp'] = self.data[25]
fields['int_temp'] = self.data[27]
fields['soc'] = self.data[29]
fields['co2_gram'] = int.from_bytes(self.data[33:35], byteorder='little')
self.callback(fields)
def tick(self):
try:
while (self.ser.inWaiting()):
self.parse(self.ser.read(100))
# Send poll packet to request data every 5 seconds
if (time.time() - self.timeout) > 5:
self.ser.write(REQUEST_MSG0)
self.timeout = time.time()
#time.sleep(0.5)
#self.ser.write(LOAD_OFF)
except IOError:
print("Serial port error, fixing")
self.ser.close()
opened = 0
while not opened:
try:
self.ser = serial.Serial(self.port,38400,timeout=0)
time.sleep(0.5)
if self.ser.read(100):
opened = 1
else:
self.ser.close()
except serial.serialutil.SerialException:
time.sleep(0.5)
self.ser.close()
print("Error fixed")
pv_volt = parse
def handle_data(d):
pv_volt = d['pv_volt']
bat_volt = d['bat_volt']
chg_mode = d['chg_mode']
chg_cur = d['chg_cur']
load_volt = d['load_volt']
load_cur = d['load_cur']
load_power = d['load_power']
chg_power = d['chg_power']
bat_temp = d['bat_temp']
int_temp = d['int_temp']
soc = d['soc']
co2_gram = d['co2_gram']
# Correct error in readings
d['bat_volt'] *= 1.107
d['load_volt'] *= 1.09
# Only correct if reading is not zero
if d['chg_cur']:
d['chg_cur'] += 1.5
# chg_power uses uncorrected voltage/current, so recalculate
actual_power = d['bat_volt']*d['chg_cur']
print("PV Voltage: %.1f V" % (d['pv_volt']))
print("Battery Voltage: %.1f V" % (d['bat_volt']))
print("Charging (status: %s): %.1f A, %.1f W" % (esmart.DEVICE_MODE[d['chg_mode']], d['chg_cur'], actual_power))
print("Discharging: %.1f V, %.1f A, %.1f W" % (d['load_volt'], d['load_cur'], d['load_power']))
print("Load Voltage: %.1f V" %(d['load_volt']))
print("Load Current: %.1f A" %(d['load_cur']))
print("Charge Power: %.1f W" %(d['chg_power']))
print("Load Power: %.1f W" %(d['load_power']))
print("External Temperature: %.1f °C" %(d['bat_temp']))
print("Internal Temperature: %.1f °C" %(d['int_temp']))
print("State of Charge: %.1f %%" %(d['soc']))
print("CO2 Reduction: %.1f g" %(d['co2_gram']))
e = esmart.esmart()
e.open("/dev/ttyUSB0")
e.set_callback(handle_data)
update_sheet("Sheet1", pv_volt)
time.sleep(0.5)