fzyzcjy / flutter_rust_bridge

Flutter/Dart <-> Rust binding generator, feature-rich, but seamless and simple.
https://fzyzcjy.github.io/flutter_rust_bridge/
MIT License
4.22k stars 290 forks source link

Web not rendering, wrong mime type #1671

Closed Ch4s3r closed 9 months ago

Ch4s3r commented 9 months ago

Describe the bug

Creating a new project and then building it for web fails with this error:

Refused to execute script from 'http://localhost:65533/pkg/rust_lib.js' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled.

Steps to reproduce

  1. flutter_rust_bridge_codegen create my_app && cd my_app
  2. Delete integration_test/simple_test.dart
  3. flutter_rust_bridge_codegen generate && flutter run -d chrome --web-header=Cross-Origin-Opener-Policy=same-origin --web-header=Cross-Origin-Embedder-Policy=require-corp (flutter version >=17)

Logs

❯ RUST_LOG=debug flutter_rust_bridge_codegen generate                                                                                                                                
[2024-01-15T16:17:55.374Z DEBUG /Users/lampe/.cargo/registry/src/index.crates.io-6f17d22bba15001f/flutter_rust_bridge_codegen-2.0.0-dev.19/src/main.rs:24] cli=Cli { verbose: false, command: Generate(GenerateCommandArgs { watch: false, primary: GenerateCommandArgsPrimary { config_file: None, rust_input: None, dart_output: None, c_output: None, duplicated_c_output: None, rust_root: None, rust_output: None, dart_entrypoint_class_name: None, dart_format_line_length: None, no_dart_enums_style: false, no_add_mod_to_lib: false, llvm_path: None, llvm_compiler_opts: None, dart_root: None, no_build_runner: false, extra_headers: None, no_web: false, no_deps_check: false, default_external_library_loader_web_prefix: None, no_dart3: false, dump: None, dump_all: false } }) }
[2024-01-15T16:17:55.374Z DEBUG /Users/lampe/.cargo/registry/src/index.crates.io-6f17d22bba15001f/flutter_rust_bridge_codegen-2.0.0-dev.19/src/binary/commands_parser.rs:8] compute_codegen_config: mode=from_files_auto
[2024-01-15T16:17:55.374Z DEBUG /Users/lampe/.cargo/registry/src/index.crates.io-6f17d22bba15001f/flutter_rust_bridge_codegen-2.0.0-dev.19/src/library/codegen/config/config_parser.rs:43] Found config file flutter_rust_bridge.yaml
[2024-01-15T16:17:55.374Z DEBUG /Users/lampe/.cargo/registry/src/index.crates.io-6f17d22bba15001f/flutter_rust_bridge_codegen-2.0.0-dev.19/src/library/codegen/mod.rs:25] config=Config { base_dir: Some(""), rust_input: "rust/src/api/**/*.rs", dart_output: "lib/src/rust", c_output: None, duplicated_c_output: None, rust_root: None, rust_output: None, dart_entrypoint_class_name: None, dart_format_line_length: None, dart_enums_style: None, add_mod_to_lib: None, llvm_path: None, llvm_compiler_opts: None, dart_root: None, build_runner: None, extra_headers: None, web: None, deps_check: None, dart3: None, default_external_library_loader_web_prefix: None, dump: None, dump_all: None } meta_config=MetaConfig { watch: false }
[2024-01-15T16:17:55.374Z DEBUG /Users/lampe/.cargo/registry/src/index.crates.io-6f17d22bba15001f/flutter_rust_bridge_codegen-2.0.0-dev.19/src/library/codegen/config/internal_config_parser.rs:40] InternalConfig.parse base_dir="/Users/lampe/IdeaProjects/personal/my_app"
[2024-01-15T16:17:55.460Z DEBUG /Users/lampe/.cargo/registry/src/index.crates.io-6f17d22bba15001f/flutter_rust_bridge_codegen-2.0.0-dev.19/src/library/codegen/mod.rs:28] internal_config=InternalConfig { controller: ControllerInternalConfig { watch: false, watching_paths: ["/Users/lampe/IdeaProjects/personal/my_app/rust/src"], exclude_paths: ["/Users/lampe/IdeaProjects/personal/my_app/rust/src/frb_generated.rs", "/Users/lampe/IdeaProjects/personal/my_app/rust/src/frb_generated.io.rs", "/Users/lampe/IdeaProjects/personal/my_app/rust/src/frb_generated.web.rs"], max_count: None }, preparer: PreparerInternalConfig { dart_root: "/Users/lampe/IdeaProjects/personal/my_app", deps_check: true }, parser: ParserInternalConfig { rust_input_path_pack: RustInputPathPack { rust_input_paths: ["/Users/lampe/IdeaProjects/personal/my_app/rust/src/api/simple.rs"] }, rust_crate_dir: "/Users/lampe/IdeaProjects/personal/my_app/rust" }, generator: GeneratorInternalConfig { api_dart: GeneratorApiDartInternalConfig { dart_enums_style: true, dart3: true, dart_decl_base_output_path: "/Users/lampe/IdeaProjects/personal/my_app/lib/src/rust", dart_entrypoint_class_name: "RustLib" }, wire: GeneratorWireInternalConfig { dart: GeneratorWireDartInternalConfig { web_enabled: true, llvm_path: ["/opt/homebrew/opt/llvm", "/usr/local/opt/llvm", "/usr/lib/llvm-9", "/usr/lib/llvm-10", "/usr/lib/llvm-11", "/usr/lib/llvm-12", "/usr/lib/llvm-13", "/usr/lib/llvm-14", "/usr/lib/", "/usr/lib64/", "C:/Program Files/llvm", "C:/msys64/mingw64"], llvm_compiler_opts: "", dart_root: "/Users/lampe/IdeaProjects/personal/my_app", extra_headers: "", dart_impl_output_path: TargetOrCommonMap { common: "/Users/lampe/IdeaProjects/personal/my_app/lib/src/rust/frb_generated.dart", io: "/Users/lampe/IdeaProjects/personal/my_app/lib/src/rust/frb_generated.io.dart", web: "/Users/lampe/IdeaProjects/personal/my_app/lib/src/rust/frb_generated.web.dart" }, dart_output_class_name_pack: DartOutputClassNamePack { entrypoint_class_name: "RustLib", api_class_name: "RustLibApi", api_impl_class_name: "RustLibApiImpl", api_impl_platform_class_name: "RustLibApiImplPlatform", wire_class_name: "RustLibWire", wasm_module_name: "RustLibWasmModule" }, default_external_library_loader: GeneratorWireDartDefaultExternalLibraryLoaderInternalConfig { stem: "rust_lib", io_directory: "rust/target/release/", web_prefix: "pkg/" }, c_symbol_prefix: "frbgen_my_app_" }, rust: GeneratorWireRustInternalConfig { rust_input_path_pack: RustInputPathPack { rust_input_paths: ["/Users/lampe/IdeaProjects/personal/my_app/rust/src/api/simple.rs"] }, rust_crate_dir: "/Users/lampe/IdeaProjects/personal/my_app/rust", web_enabled: true, rust_output_path: TargetOrCommonMap { common: "/Users/lampe/IdeaProjects/personal/my_app/rust/src/frb_generated.rs", io: "/Users/lampe/IdeaProjects/personal/my_app/rust/src/frb_generated.io.rs", web: "/Users/lampe/IdeaProjects/personal/my_app/rust/src/frb_generated.web.rs" }, c_symbol_prefix: "frbgen_my_app_" }, c: GeneratorWireCInternalConfig { rust_crate_dir: "/Users/lampe/IdeaProjects/personal/my_app/rust", rust_output_path: TargetOrCommonMap { common: "/Users/lampe/IdeaProjects/personal/my_app/rust/src/frb_generated.rs", io: "/Users/lampe/IdeaProjects/personal/my_app/rust/src/frb_generated.io.rs", web: "/Users/lampe/IdeaProjects/personal/my_app/rust/src/frb_generated.web.rs" }, c_output_path: None, c_symbol_prefix: "frbgen_my_app_" } } }, polisher: PolisherInternalConfig { duplicated_c_output_path: [], dart_format_line_length: 80, add_mod_to_lib: true, build_runner: true, web_enabled: true, dart_root: "/Users/lampe/IdeaProjects/personal/my_app", rust_crate_dir: "/Users/lampe/IdeaProjects/personal/my_app/rust", rust_output_path: TargetOrCommonMap { common: "/Users/lampe/IdeaProjects/personal/my_app/rust/src/frb_generated.rs", io: "/Users/lampe/IdeaProjects/personal/my_app/rust/src/frb_generated.io.rs", web: "/Users/lampe/IdeaProjects/personal/my_app/rust/src/frb_generated.web.rs" }, c_output_path: None }, dumper: DumperInternalConfig { dump_contents: [], dump_directory: "/Users/lampe/IdeaProjects/personal/my_app/rust/target/frb_dump" } }
[2024-01-15T16:17:55.461Z DEBUG /Users/lampe/.cargo/registry/src/index.crates.io-6f17d22bba15001f/flutter_rust_bridge_codegen-2.0.0-dev.19/src/library/utils/dart_repository/dart_repo.rs:22] Guessing toolchain the runner is run into
[2024-01-15T16:17:55.461Z DEBUG /Users/lampe/.cargo/registry/src/index.crates.io-6f17d22bba15001f/flutter_rust_bridge_codegen-2.0.0-dev.19/src/library/commands/command_runner.rs:109] execute command: bin=sh args="-c \"flutter\" \"--version\"" current_dir=None cmd="sh" "-c" "\"flutter\" \"--version\""
[2024-01-15T16:17:55.749Z DEBUG /Users/lampe/.cargo/registry/src/index.crates.io-6f17d22bba15001f/flutter_rust_bridge_codegen-2.0.0-dev.19/src/library/commands/command_runner.rs:120] command="sh" "-c" "\"flutter\" \"--version\"" stdout=Flutter 3.19.0-0.1.pre • channel beta • https://github.com/flutter/flutter.git
Framework • revision 1a9a60d044 (5 days ago) • 2024-01-10 13:38:09 -0800
Engine • revision bbebee1465
Tools • Dart 3.3.0 (build 3.3.0-279.0.dev) • DevTools 2.31.0
 stderr=
[2024-01-15T16:17:55.750Z DEBUG /Users/lampe/.cargo/registry/src/index.crates.io-6f17d22bba15001f/flutter_rust_bridge_codegen-2.0.0-dev.19/src/library/utils/dart_repository/dart_repo.rs:71] Checking presence of ffigen in dev_dependencies at /Users/lampe/IdeaProjects/personal/my_app
[2024-01-15T16:17:55.750Z DEBUG /Users/lampe/.cargo/registry/src/index.crates.io-6f17d22bba15001f/flutter_rust_bridge_codegen-2.0.0-dev.19/src/library/utils/dart_repository/dart_repo.rs:103] Checking presence of ffigen in dev_dependencies at /Users/lampe/IdeaProjects/personal/my_app
[2024-01-15T16:17:55.750Z DEBUG /Users/lampe/.cargo/registry/src/index.crates.io-6f17d22bba15001f/flutter_rust_bridge_codegen-2.0.0-dev.19/src/library/codegen/parser/reader.rs:22] read_rust_file rust_file_path="/Users/lampe/IdeaProjects/personal/my_app/rust/src/api/simple.rs" module=Some("api::simple")
[2024-01-15T16:17:55.750Z DEBUG /Users/lampe/.cargo/registry/src/index.crates.io-6f17d22bba15001f/flutter_rust_bridge_codegen-2.0.0-dev.19/src/library/commands/cargo_expand.rs:85] Running cargo expand in '"/Users/lampe/IdeaProjects/personal/my_app/rust"'
[2024-01-15T16:17:55.750Z DEBUG /Users/lampe/.cargo/registry/src/index.crates.io-6f17d22bba15001f/flutter_rust_bridge_codegen-2.0.0-dev.19/src/library/commands/command_runner.rs:109] execute command: bin=cargo args="expand --lib --theme=none --ugly" current_dir=Some("/Users/lampe/IdeaProjects/personal/my_app/rust") cmd=cd "/Users/lampe/IdeaProjects/personal/my_app/rust" && "cargo" "expand" "--lib" "--theme=none" "--ugly"
[2024-01-15T16:17:55.875Z DEBUG /Users/lampe/.cargo/registry/src/index.crates.io-6f17d22bba15001f/flutter_rust_bridge_codegen-2.0.0-dev.19/src/library/commands/command_runner.rs:120] command=cd "/Users/lampe/IdeaProjects/personal/my_app/rust" && "cargo" "expand" "--lib" "--theme=none" "--ugly" stdout=#![feature(prelude_import)]
#[prelude_import]
use std::prelude::rust_2021::*;
#[macro_use]
extern crate std;
pub mod api {
    /* AUTO INJECTED BY flutter_rust_bridge. This line may not be accurate, and you can change it according to your needs. */
    pub mod simple {
        /// frb_marker: #[frb(sync)]
        pub fn greet(name: String) -> String {
            {
                let res =
                    ::alloc::fmt::format(format_args!("Hello, {0}!", name));
                res
            }
        }
        /// frb_marker: #[frb(init)]
        pub fn init_app() { flutter_rust_bridge::setup_default_user_utils(); }
    }
}
mod frb_generated {
    #![allow(non_camel_case_types, unused, non_snake_case, clippy ::
    needless_return, clippy :: redundant_closure_call, clippy ::
    redundant_closure, clippy :: useless_conversion, clippy :: unit_arg,
    clippy :: unused_unit, clippy :: double_parens, clippy :: let_and_return,
    clippy :: too_many_arguments)]
    use flutter_rust_bridge::for_generated::byteorder::{
        NativeEndian, ReadBytesExt, WriteBytesExt,
    };
    use flutter_rust_bridge::for_generated::transform_result_dco;
    use flutter_rust_bridge::{Handler, IntoIntoDart};
    use std::collections::HashMap;
    use std::marker::PhantomData;
    use std::sync::Arc;
    pub struct MoiArc<T: ?Sized + MoiArcValue> {
        object_id: Option<ObjectId>,
        value: Option<Arc<T>>,
        _phantom: PhantomData<T>,
    }
    #[automatically_derived]
    impl<T: ::core::fmt::Debug + ?Sized + MoiArcValue> ::core::fmt::Debug for
        MoiArc<T> {
        #[inline]
        fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
            ::core::fmt::Formatter::debug_struct_field3_finish(f, "MoiArc",
                "object_id", &self.object_id, "value", &self.value,
                "_phantom", &&self._phantom)
        }
    }
    impl<T: ?Sized + MoiArcValue> Drop for MoiArc<T> {
        fn drop(&mut self) {
            if let Some(object_id) = self.object_id {
                    Self::decrement_strong_count(object_id);
                }
        }
    }
    impl<T: ?Sized + MoiArcValue> AsRef<T> for MoiArc<T> {
        fn as_ref(&self) -> &T { self.value.as_ref().unwrap().as_ref() }
    }
    impl<T: ?Sized + MoiArcValue>
        ::flutter_rust_bridge::for_generated::BaseArc<T> for MoiArc<T> {
        fn new(value: T) -> Self where T: Sized {
            let mut pool = T::get_pool().write().unwrap();
            let object_id = pool.id_generator.next_id();
            let value = Arc::new(value);
            let old_value =
                pool.map.insert(object_id,
                    MoiArcPoolValue { ref_count: 1, value: value.clone() });
            if !old_value.is_none() {
                    ::core::panicking::panic("assertion failed: old_value.is_none()")
                };
            Self {
                object_id: Some(object_id),
                value: Some(value),
                _phantom: PhantomData,
            }
        }
        fn try_unwrap(mut self) -> Result<T, Self> where T: Sized {
            let pool = &mut T::get_pool().write().unwrap();
            if pool.map.get(&self.object_id.unwrap()).unwrap().ref_count == 1
                    {
                    Self::decrement_strong_count_raw(self.object_id.unwrap(),
                        pool);
                    self.object_id.take().unwrap();
                    Ok(Arc::into_inner(self.value.take().unwrap()).unwrap())
                } else { Err(self) }
        }
        fn into_inner(self) -> Option<T> where T: Sized {
            self.try_unwrap().ok()
        }
        fn into_raw(mut self) -> usize { self.object_id.take().unwrap() }
    }
    impl<T: ?Sized + MoiArcValue> Clone for MoiArc<T> {
        fn clone(&self) -> Self {
            Self::increment_strong_count(self.object_id.unwrap());
            Self {
                object_id: self.object_id,
                value: self.value.clone(),
                _phantom: PhantomData,
            }
        }
    }
    impl<T: ?Sized + MoiArcValue> MoiArc<T> {
        pub(crate) fn from_raw(raw: usize) -> Self where T: Sized {
            let map = &T::get_pool().read().unwrap().map;
            Self {
                object_id: Some(raw),
                value: Some(map.get(&raw).unwrap().value.clone()),
                _phantom: PhantomData,
            }
        }
        pub fn increment_strong_count(raw: usize) {
            let map = &mut T::get_pool().write().unwrap().map;
            map.get_mut(&raw).unwrap().ref_count += 1;
        }
        pub fn decrement_strong_count(raw: usize) {
            Self::decrement_strong_count_raw(raw,
                &mut T::get_pool().write().unwrap())
        }
        fn decrement_strong_count_raw(raw: usize,
            pool: &mut MoiArcPoolInner<T>) {
            let value = pool.map.get_mut(&raw).unwrap();
            value.ref_count -= 1;
            if value.ref_count == 0 { pool.map.remove(&raw).unwrap(); }
        }
    }
    pub trait MoiArcValue: 'static {
        fn get_pool()
        -> &'static MoiArcPool<Self>;
    }
    type ObjectId = usize;
    pub type MoiArcPool<T> = std::sync::RwLock<MoiArcPoolInner<T>>;
    pub struct MoiArcPoolInner<T: ?Sized> {
        map: HashMap<ObjectId, MoiArcPoolValue<T>>,
        id_generator: IdGenerator,
    }
    impl<T: ?Sized> Default for MoiArcPoolInner<T> {
        fn default() -> Self {
            Self { map: HashMap::new(), id_generator: Default::default() }
        }
    }
    struct IdGenerator {
        next_id: ObjectId,
    }
    impl Default for IdGenerator {
        fn default() -> Self { Self { next_id: Self::MIN_ID } }
    }
    impl IdGenerator {
        const MIN_ID: ObjectId = 1;
        const MAX_ID: ObjectId = 2147483600;
        fn next_id(&mut self) -> ObjectId {
            let ans = self.next_id;
            self.next_id =
                if self.next_id >= Self::MAX_ID {
                        Self::MIN_ID
                    } else { self.next_id + 1 };
            ans
        }
    }
    impl<T: ?Sized> MoiArcPoolInner<T> {}
    struct MoiArcPoolValue<T: ?Sized> {
        ref_count: i32,
        value: Arc<T>,
    }
    use ::flutter_rust_bridge::for_generated::{
        decode_rust_opaque_nom, StdArc,
    };
    use ::flutter_rust_bridge::RustOpaqueNom;
    fn decode_rust_opaque_moi<T: MoiArcValue + Send + Sync>(ptr: usize)
        -> RustOpaqueMoi<T> {
        RustOpaqueMoi::from_arc(MoiArc::<T>::from_raw(ptr))
    }
    pub type RustOpaqueMoi<T> =
        ::flutter_rust_bridge::for_generated::RustOpaqueBase<T, MoiArc<T>>;
    pub trait CstDecode<T> {
        fn cst_decode(self)
        -> T;
    }
    impl<T, S> CstDecode<Option<T>> for *mut S where *mut S: CstDecode<T> {
        fn cst_decode(self) -> Option<T> {
            (!self.is_null()).then(|| self.cst_decode())
        }
    }
    pub trait SseDecode {
        fn sse_decode(deserializer:
            &mut ::flutter_rust_bridge::for_generated::SseDeserializer)
        -> Self;
        fn sse_decode_single(message:
                ::flutter_rust_bridge::for_generated::Dart2RustMessageSse)
            -> Self where Self: Sized {
            let mut deserializer =
                ::flutter_rust_bridge::for_generated::SseDeserializer::new(message);
            let ans = Self::sse_decode(&mut deserializer);
            deserializer.end();
            ans
        }
    }
    pub trait SseEncode {
        fn sse_encode(self,
        serializer: &mut ::flutter_rust_bridge::for_generated::SseSerializer);
    }
    fn transform_result_sse<T, E>(raw: Result<T, E>)
        ->
            Result<::flutter_rust_bridge::for_generated::Rust2DartMessageSse,
            ::flutter_rust_bridge::for_generated::Rust2DartMessageSse> where
        T: SseEncode, E: SseEncode {
        use ::flutter_rust_bridge::for_generated::{Rust2DartAction, SseCodec};
        match raw {
            Ok(raw) =>
                Ok(SseCodec::encode(Rust2DartAction::Success,
                        |serializer| { raw.sse_encode(serializer) })),
            Err(raw) =>
                Err(SseCodec::encode(Rust2DartAction::Error,
                        |serializer| { raw.sse_encode(serializer) })),
        }
    }
    pub struct StreamSink<T,
        Rust2DartCodec: ::flutter_rust_bridge::for_generated::BaseCodec =
        ::flutter_rust_bridge::for_generated::DcoCodec> {
        base: ::flutter_rust_bridge::for_generated::StreamSinkBase<T,
        Rust2DartCodec>,
    }
    #[automatically_derived]
    impl<T: ::core::clone::Clone, Rust2DartCodec: ::core::clone::Clone +
        ::flutter_rust_bridge::for_generated::BaseCodec> ::core::clone::Clone
        for StreamSink<T, Rust2DartCodec> {
        #[inline]
        fn clone(&self) -> StreamSink<T, Rust2DartCodec> {
            StreamSink { base: ::core::clone::Clone::clone(&self.base) }
        }
    }
    impl<T, Rust2DartCodec: ::flutter_rust_bridge::for_generated::BaseCodec>
        StreamSink<T, Rust2DartCodec> {
        pub fn new(base:
                ::flutter_rust_bridge::for_generated::StreamSinkBase<T,
                Rust2DartCodec>) -> Self {
            Self { base }
        }
    }
    impl<T> StreamSink<T, ::flutter_rust_bridge::for_generated::DcoCodec> {
        pub fn add<T2>(&self, value: T)
            -> Result<(), ::flutter_rust_bridge::Rust2DartSendError> where
            T: ::flutter_rust_bridge::IntoIntoDart<T2>,
            T2: ::flutter_rust_bridge::IntoDart {
            self.base.add(::flutter_rust_bridge::for_generated::DcoCodec::encode(::flutter_rust_bridge::for_generated::Rust2DartAction::Success,
                    value.into_into_dart()))
        }
    }
    impl<T> StreamSink<T, ::flutter_rust_bridge::for_generated::SseCodec>
        where T: SseEncode {
        pub fn add(&self, value: T)
            -> Result<(), ::flutter_rust_bridge::Rust2DartSendError> {
            self.base.add(::flutter_rust_bridge::for_generated::SseCodec::encode(::flutter_rust_bridge::for_generated::Rust2DartAction::Success,
                    |serializer| value.sse_encode(serializer)))
        }
    }
    #[allow(missing_copy_implementations)]
    #[allow(non_camel_case_types)]
    #[allow(dead_code)]
    pub struct FLUTTER_RUST_BRIDGE_HANDLER {
        __private_field: (),
    }
    #[doc(hidden)]
    pub static FLUTTER_RUST_BRIDGE_HANDLER: FLUTTER_RUST_BRIDGE_HANDLER =
        FLUTTER_RUST_BRIDGE_HANDLER { __private_field: () };
    impl ::lazy_static::__Deref for FLUTTER_RUST_BRIDGE_HANDLER {
        type Target =
            ::flutter_rust_bridge::DefaultHandler<::flutter_rust_bridge::for_generated::SimpleThreadPool>;
        fn deref(&self)
            ->
                &::flutter_rust_bridge::DefaultHandler<::flutter_rust_bridge::for_generated::SimpleThreadPool> {
            #[inline(always)]
            fn __static_ref_initialize()
                ->
                    ::flutter_rust_bridge::DefaultHandler<::flutter_rust_bridge::for_generated::SimpleThreadPool> {
                ::flutter_rust_bridge::DefaultHandler::new_simple(Default::default())
            }
            #[inline(always)]
            fn __stability()
                ->
                    &'static ::flutter_rust_bridge::DefaultHandler<::flutter_rust_bridge::for_generated::SimpleThreadPool> {
                static LAZY:
                    ::lazy_static::lazy::Lazy<::flutter_rust_bridge::DefaultHandler<::flutter_rust_bridge::for_generated::SimpleThreadPool>>
                    =
                    ::lazy_static::lazy::Lazy::INIT;
                LAZY.get(__static_ref_initialize)
            }
            __stability()
        }
    }
    impl ::lazy_static::LazyStatic for FLUTTER_RUST_BRIDGE_HANDLER {
        fn initialize(lazy: &Self) { let _ = &**lazy; }
    }
    fn wire_greet_impl(name: impl CstDecode<String>)
        -> flutter_rust_bridge::for_generated::WireSyncRust2DartDco {
        FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::<flutter_rust_bridge::for_generated::DcoCodec,
            _>(flutter_rust_bridge::for_generated::TaskInfo {
                debug_name: "greet",
                port: None,
                mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync,
            },
            move ||
                {
                    let api_name = name.cst_decode();
                    transform_result_dco((move ||
                                    {
                                        Result::<_, ()>::Ok(crate::api::simple::greet(api_name))
                                    })())
                })
    }
    fn wire_init_app_impl(port_:
            flutter_rust_bridge::for_generated::MessagePort) {
        FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::<flutter_rust_bridge::for_generated::DcoCodec,
            _,
            _>(flutter_rust_bridge::for_generated::TaskInfo {
                debug_name: "init_app",
                port: Some(port_),
                mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal,
            },
            move ||
                {
                    move |context|
                        {
                            transform_result_dco((move ||
                                            Result::<_, ()>::Ok(crate::api::simple::init_app()))())
                        }
                })
    }
    impl CstDecode<u8> for u8 {
        fn cst_decode(self) -> u8 { self }
    }
    impl SseDecode for String {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            let mut inner = <Vec<u8>>::sse_decode(deserializer);
            return String::from_utf8(inner).unwrap();
        }
    }
    impl SseDecode for Vec<u8> {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            let mut len_ = <i32>::sse_decode(deserializer);
            let mut ans_ = ::alloc::vec::Vec::new();
            for idx_ in 0..len_ { ans_.push(<u8>::sse_decode(deserializer)); }
            return ans_;
        }
    }
    impl SseDecode for u8 {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            deserializer.cursor.read_u8().unwrap()
        }
    }
    impl SseDecode for () {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {}
    }
    impl SseDecode for i32 {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            deserializer.cursor.read_i32::<NativeEndian>().unwrap()
        }
    }
    impl SseDecode for bool {
        fn sse_decode(deserializer:
                &mut flutter_rust_bridge::for_generated::SseDeserializer)
            -> Self {
            deserializer.cursor.read_u8().unwrap() != 0
        }
    }
    impl SseEncode for String {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            <Vec<u8>>::sse_encode(self.into_bytes(), serializer);
        }
    }
    impl SseEncode for Vec<u8> {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            <i32>::sse_encode(self.len() as _, serializer);
            for item in self { <u8>::sse_encode(item, serializer); }
        }
    }
    impl SseEncode for u8 {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            serializer.cursor.write_u8(self).unwrap();
        }
    }
    impl SseEncode for () {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {}
    }
    impl SseEncode for i32 {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            serializer.cursor.write_i32::<NativeEndian>(self).unwrap();
        }
    }
    impl SseEncode for bool {
        fn sse_encode(self,
            serializer:
                &mut flutter_rust_bridge::for_generated::SseSerializer) {
            serializer.cursor.write_u8(self as _).unwrap();
        }
    }
    #[cfg(not(target_family = "wasm"))]
    #[path = "frb_generated.io.rs"]
    mod io {
        use super::*;
        use flutter_rust_bridge::for_generated::byteorder::{
            NativeEndian, ReadBytesExt, WriteBytesExt,
        };
        use flutter_rust_bridge::for_generated::transform_result_dco;
        use flutter_rust_bridge::{Handler, IntoIntoDart};
        impl CstDecode<String> for *mut wire_cst_list_prim_u_8_strict {
            fn cst_decode(self) -> String {
                let vec: Vec<u8> = self.cst_decode();
                String::from_utf8(vec).unwrap()
            }
        }
        impl CstDecode<Vec<u8>> for *mut wire_cst_list_prim_u_8_strict {
            fn cst_decode(self) -> Vec<u8> {
                unsafe {
                    let wrap =
                        flutter_rust_bridge::for_generated::box_from_leak_ptr(self);
                    flutter_rust_bridge::for_generated::vec_from_leak_ptr(wrap.ptr,
                        wrap.len)
                }
            }
        }
        pub trait NewWithNullPtr {
            fn new_with_null_ptr()
            -> Self;
        }
        impl<T> NewWithNullPtr for *mut T {
            fn new_with_null_ptr() -> Self { std::ptr::null_mut() }
        }
        #[no_mangle]
        pub extern "C" fn frbgen_my_app_dart_fn_deliver_output(call_id: i32,
            ptr_: *mut u8, rust_vec_len_: i32, data_len_: i32) {
            let message =
                unsafe {
                    flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(ptr_,
                        rust_vec_len_, data_len_)
                };
            FLUTTER_RUST_BRIDGE_HANDLER.dart_fn_handle_output(call_id,
                message)
        }
        #[no_mangle]
        pub extern "C" fn frbgen_my_app_wire_greet(name:
                *mut wire_cst_list_prim_u_8_strict)
            -> flutter_rust_bridge::for_generated::WireSyncRust2DartDco {
            wire_greet_impl(name)
        }
        #[no_mangle]
        pub extern "C" fn frbgen_my_app_wire_init_app(port_: i64) {
            wire_init_app_impl(port_)
        }
        #[no_mangle]
        pub extern "C" fn frbgen_my_app_cst_new_list_prim_u_8_strict(len: i32)
            -> *mut wire_cst_list_prim_u_8_strict {
            let ans =
                wire_cst_list_prim_u_8_strict {
                    ptr: flutter_rust_bridge::for_generated::new_leak_vec_ptr(Default::default(),
                        len),
                    len,
                };
            flutter_rust_bridge::for_generated::new_leak_box_ptr(ans)
        }
        #[repr(C)]
        pub struct wire_cst_list_prim_u_8_strict {
            ptr: *mut u8,
            len: i32,
        }
        #[automatically_derived]
        impl ::core::clone::Clone for wire_cst_list_prim_u_8_strict {
            #[inline]
            fn clone(&self) -> wire_cst_list_prim_u_8_strict {
                let _: ::core::clone::AssertParamIsClone<*mut u8>;
                let _: ::core::clone::AssertParamIsClone<i32>;
                *self
            }
        }
        #[automatically_derived]
        impl ::core::marker::Copy for wire_cst_list_prim_u_8_strict { }
    }
    #[cfg(not(target_family = "wasm"))]
    pub use io::*;
}
 stderr=    Checking rust_lib v0.1.0 (/Users/lampe/IdeaProjects/personal/my_app/rust)
    Finished dev [unoptimized + debuginfo] target(s) in 0.05s

Expected behavior

Would show a sample app instead of a blank page.

Generated binding code

No response

OS

MacOs 14.2.1 (23C71)

Version of flutter_rust_bridge_codegen

v2.0.0-dev.19

Flutter info

❯ flutter doctor -v
[✓] Flutter (Channel beta, 3.19.0-0.1.pre, on macOS 14.2.1 23C71 darwin-arm64, locale en-AT)
    • Flutter version 3.19.0-0.1.pre on channel beta at /opt/homebrew/Caskroom/flutter/3.16.7/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 1a9a60d044 (5 days ago), 2024-01-10 13:38:09 -0800
    • Engine revision bbebee1465
    • Dart version 3.3.0 (build 3.3.0-279.0.dev)
    • DevTools version 2.31.0

[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
    • Android SDK at /Users/lampe/Library/Android/sdk
    • Platform android-34, build-tools 34.0.0
    • ANDROID_HOME = /Users/lampe/Library/Android/sdk
    • Java binary at: /Users/lampe/Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 17.0.7+0-17.0.7b1000.6-10550314)
    • All Android licenses accepted.

[!] Xcode - develop for iOS and macOS (Xcode 15.2)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Build 15C500b
    ✗ Unable to get list of installed Simulator runtimes.
    • CocoaPods version 1.14.3

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 2023.1)
    • Android Studio at /Users/lampe/Applications/Android Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 17.0.7+0-17.0.7b1000.6-10550314)

[✓] IntelliJ IDEA Ultimate Edition (version 2023.3.2)
    • IntelliJ at /Users/lampe/Applications/IntelliJ IDEA Ultimate.app
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart

[✓] Connected device (2 available)
    • macOS (desktop) • macos  • darwin-arm64   • macOS 14.2.1 23C71 darwin-arm64
    • Chrome (web)    • chrome • web-javascript • Google Chrome 120.0.6099.216

[✓] Network resources
    • All expected network resources are available.

! Doctor found issues in 1 category.

Version of clang++

15.0.0 (clang-1500.1.0.2.5)

Additional context

Flutter is on beta channel with version 3.19.0-0.1.pre.

fzyzcjy commented 9 months ago

Hi, as mentioned in https://cjycode.com/flutter_rust_bridge/quickstart#3-run-it, need to run flutter_rust_bridge_codegen build-web

Because Flutter Web does not have a build hook yet (vote the corresponding issue to prioritize it if you want).

Ch4s3r commented 9 months ago

Solved the issue, thanks. Had overlooked it because it was in a tab.

fzyzcjy commented 9 months ago

You are welcome!

github-actions[bot] commented 8 months ago

This thread has been automatically locked since there has not been any recent activity after it was closed. If you are still experiencing a similar issue, please open a new issue.