【问题标题】:Flutter design pattern for offline / online web socket sync用于离线/在线网络套接字同步的 Flutter 设计模式
【发布时间】:2020-10-09 16:20:57
【问题描述】:

对 Flutter 开发相对较新,但了解基础知识。目前希望构建一个稍微复杂一点的应用程序,该应用程序需要在离线时运行,然后在重新上线时同步回服务器端。但是,在上线时,需要让屏幕上的内容根据后端的变化不断更新。

从概念上讲,是这样的:

示例流程如下:

  1. 用户加载应用,应用将其数据库与服务器同步
  2. 用户导航到屏幕 1 并从同步的本地数据库中查看相关信息
  3. 用户更改屏幕上的数据。此数据保存在数据库中,然后通知服务器。
  4. 不同的用户进行了更改(在不同的应用程序上更改了后端数据)。服务器将更改通知客户端。屏幕 1 会自动更新以反映新数据。
  5. 用户失去网络连接,但可以继续对数据进行操作,更改保存在本地
  6. 网络连接已恢复,本地所做的更改与服务器同步。

自然,在多用户环境中数据的同步方面会有一些复杂性。但是,我对此不太关心,而对用于实现需求的最佳技术或库更感兴趣。

我知道连接到 websocket 后端非常简单。同样,有许多数据库似乎是我可以使用的不错选择。我也确信离线操作并在重新在线时与后端同步是一个非常普遍的要求(尽管从 Flutter 的角度来看,我对此一无所知)。

对于正确使用的设计模式和/或工具/库/技术的任何建议或指导,我们将不胜感激。这里的目标显然是为了避免我重新发明轮子,因为我相信你们中的许多人都做过类似的事情,并且从经验中得到了很好的建议!

谢谢 戳

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    首先,我会很感激您以如此详细的方式描述您所关注的方式。

    pubspec.yaml文件中需要添加的包:

    shared_preferences

    它将用于在离线模式下存储数据。为了更好地理解,让我们看一个用例,即

    1. 用户在离线模式下进行了一些更改并退出了应用程序 在这种情况下,连接会恢复,添加的数据可能会丢失。
    2. 用户做了一些更改,假设用户在离线状态下添加了项目,如果用户在连接恢复之前再次添加了第二个项目,则之前添加的项目或数据可能会丢失。

    所以为了克服这些情况,宁愿将数据存储在本地,然后恢复连接,数据将发送到服务器。

    连接包

    我们将使用这个包来检查我们连接到互联网的天气。

    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”。

    【讨论】:

      猜你喜欢
      • 2016-07-04
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 2018-10-06
      • 2020-01-13
      相关资源
      最近更新 更多