首先,我会很感激您以如此详细的方式描述您所关注的方式。
pubspec.yaml文件中需要添加的包:
shared_preferences
它将用于在离线模式下存储数据。为了更好地理解,让我们看一个用例,即
- 用户在离线模式下进行了一些更改并退出了应用程序
在这种情况下,连接会恢复,添加的数据可能会丢失。
- 用户做了一些更改,假设用户在离线状态下添加了项目,如果用户在连接恢复之前再次添加了第二个项目,则之前添加的项目或数据可能会丢失。
所以为了克服这些情况,宁愿将数据存储在本地,然后恢复连接,数据将发送到服务器。
连接包
我们将使用这个包来检查我们连接到互联网的天气。
socket_io_client
对于向服务器发出请求,我们通常有两种选择,一种是此 Web 套接字,另一种是 http 请求。
在在线模式下,我们通常使用 http 请求,因为它在实现时相对不那么复杂,尽管 websocket 在在线模式下使用,当我们不想看到加载或请求命中时间时,因为 websocket 只连接到服务器一次,之后可以直接发出和从服务器获取数据。
工作:-
第 1 步首先检查我们是在线还是离线,如果离线,然后将更改或添加的数据存储在本地(如果需要,请尝试以列表形式存储数据,并在每次用户将数据添加为列表项时添加,以后整个列表或数组将发送到服务器)
//checking for network
Future<bool> checkConnection() async{
var connectivityResult = await(Connectivity().checkConnectivity());
if (connectivityResult == ConnectivityResult.mobile) {
return true;
} else if (connectivityResult == ConnectivityResult.wifi) {
return true;
}
return false;
}
如果网络状态为假,则在本地存储数据
List<String> listAdded = pref.getStringList("key") ?? [];
ticketCollectorObject.add(json.encode(newDataList));
pref.setStringList("key", listAdded);
步骤 2 发送数据到服务器
现在我们必须将 websocket 连接到后端,并且已经建立的连接可以向 socket 发送或发送数据。
使用它可以连接到网络套接字
void connectToServer() async {
try {
String token = token;
SharedPreferences pref = await SharedPreferences.getInstance();
// Configure socket transports must be sepecified
IO.Socket socket = IO.io(
'http:// host url',
OptionBuilder().setTransports(['websocket']) // for Flutter or Dart VM
.setExtraHeaders({'token': token}) // optional
.build());
// Connect to websocket
socket.connect();
socket.onConnect((_) {
print('connection successful with id: ${socket.id}');
List<String> offlineData =
pref.getStringList("key");
List<Map<String, dynamic>> listObject = [];
for (int i = 0; i < offlineData.length; i++) {
listObject.add(jsonDecode(offlineData[i]));
}
String dataToSend = jsonEncode(listObject);
print(dataToSend);
//response from server will be printed
socket.on(
'response',
(data) {
print(data);
if (data['message'] == "Success")
//as data was sent successfully so have to clean locally stored data
pref.setStringList("key", []);
},
);
print("status of socket with server connedction : ${socket.connected}");
socket.on('disconnect', (_) => print('disconnect'));
socket.on('fromServer', (_) => print(_));
} catch (e) {
print(e.toString());
}
}
call this connectToServer() function in initstate((){}) of home page as well with the send button在屏幕上,这样即使用户关闭应用程序或重新启动应用程序,数据也会自动更新
在套接字与服务器成功连接后发出数据,套接字继续尝试发送数据,直到请求成功命中,因此在离线模式下,我们调用 connectToServer() 数据将被发送到服务器,互联网在没有任何用户的情况下恢复自动交互。
注释:
- 确保后端和前端使用的套接字版本应该相同。
- 服务器网址应该是“http”而不是“https”。