it seems ridiculous that we have to embed an entire browser, meant for internet web browsing, just to create a cross-platform UI with moderate ease.

Why are native or semi-native UI frameworks lagging so far behind? am I wrong in thinking this? are there easier, declarative frameworks for creating semi-native UIs on desktop that don’t look like windows 1998?

  • prof@infosec.pub
    link
    fedilink
    arrow-up
    3
    ·
    edit-2
    6 months ago

    Ha! I’m partially looking at this issue in my bachelor’s thesis.

    It’s not at all necessary to embed a browser, but it’s really easy to transfer your web app to a “near native” experience with stuff like electron, ionic, cordova, react native or whatever other web stuff is out there. The issue is mostly that native APIs are complicated and relying on web views or just providing your own “browser” is a relatively easy approach.

    Stuff like Flutter, Xamarin or .NET MAUI compile depending on the platform to native or are interpreted by a runtime. There’s a study I use that compares Flutter to React Native, native Java and Ionic on Android and finds that unsurprisingly the native implementation is best, but is closely followed by Flutter (with a few hiccups), with the remainder being significantly slower.

    The thing is. I don’t think these compiled frameworks lag behind in any way. But when you have a dev team, that’s competent in web development, you won’t make them learn C#, Xaml, Dart or C++, just to get native API access - you’ll just let a framework handle that for you because it’s cheaper and easier.

    Edit: To add some further reading. This paper and this one explore the different approaches out there and suggest which one might be “the best”. I don’t feel like they’re good papers, but there’s almost no other write up of cross-platform dev approaches out there.

    Edit2: I also believe that the approach “we are web devs that want access to native APIs” may be turned around in the future, since Flutter and now also .NET offer ways to deploy cross-platforn apps as web apps. I’ll get back to writing the thesis now and stop editing.

    • BatmanAoD@programming.dev
      link
      fedilink
      arrow-up
      1
      ·
      6 months ago

      I remember thinking that Qt seemed like a really good approach that should be more widely adopted…until I actually had to use it.

      Not that it’s terrible; it’s really not. But C++ is just not at all a good language for <s>anything</s> UI stuff.

  • Irdial@lemmy.sdf.org
    link
    fedilink
    English
    arrow-up
    1
    ·
    6 months ago

    This is because each desktop operating system using a different graphics rendering engine—Quartz on macOS and X/Wayland on Linux, for example. In order to write an application that works on all major operating systems, you either need to use a graphics library that has already done the heavy lifting of calling the native frameworks under the hood or you have to do it yourself. Or you can use a web-based graphics library that has also already done that heavy lifting, with the added advantage that you can use languages like HTML, CSS, and Javascript to easily create visual elements. This is attractive when the alternatives like Qt are notoriously difficult to deploy and force you to use C/C++.

    • abhibeckert@lemmy.world
      link
      fedilink
      arrow-up
      1
      ·
      edit-2
      6 months ago

      Quartz (usually referred to as Core Graphics) isn’t recommended anymore on Macs.

      Developers should be using SwiftUI now, which is a completely different approach:

      class HelloWorldView: NSView {
          override func draw(_ dirtyRect: NSRect) {
              super.draw(dirtyRect)
      
              // Drawing code here.
              guard let context = NSGraphicsContext.current?.cgContext else { return }
      
              // Set text attributes
              let attributes: [NSAttributedString.Key: Any] = [
                  .font: NSFont.systemFont(ofSize: 24),
                  .foregroundColor: NSColor.black
              ]
      
              // Create the string
              let string = NSAttributedString(string: "Hello World", attributes: attributes)
      
              // Draw the string
              string.draw(at: CGPoint(x: 20, y: 20))
          }
      }
      

      Here’s the same thing with SwiftUI:

      struct HelloWorldView: View {
          var body: some View {
              Text("Hello World")
                  .font(.system(size: 24))
                  .foregroundColor(.black)
                  .padding()
          }
      }
      
  • blackshadev@programming.dev
    link
    fedilink
    arrow-up
    1
    ·
    6 months ago

    You mean like qt/qml? Due mind that even with those ui toolkits you will need to ship ‘some’ library. In case of QT it is not minimal at all. GTK can be more minimal but it still is significant.

    Also there is tauri. Which doesn’t ship a browser, but uses the platform native we view and is compiled while still having an amazing dev experience.

      • nycki@lemmy.world
        link
        fedilink
        English
        arrow-up
        1
        ·
        6 months ago

        Electron apps ship their own chromium-based renderer, but ‘webview’ means the OS gets to use its own renderer. It’s still a browser-like environment, but at least the OS can choose the most performant one.

    • Cyclohexane@lemmy.mlOP
      link
      fedilink
      arrow-up
      0
      ·
      6 months ago

      I don’t understand exactly how this is different. Is “WebView” not still very similar to a browser?

      • charolastra@programming.dev
        link
        fedilink
        arrow-up
        1
        ·
        edit-2
        6 months ago

        It doesn’t embed Chromium, it uses the native webview that already exists on the system. The average app I make using Tauri is less than 15MB, and being Rust on the backend you can go as low level as you like. The Tauri API provides access in your front end code to all the native APIs you can think of.