16 changed files with 581 additions and 2 deletions
@ -0,0 +1,44 @@ |
|||||||
|
// For format details, see https://aka.ms/devcontainer.json. For config options, see the |
||||||
|
// README at: https://github.com/devcontainers/templates/tree/main/src/docker-existing-docker-compose |
||||||
|
{ |
||||||
|
"name": "dev-flutter-01", |
||||||
|
|
||||||
|
// Update the 'dockerComposeFile' list if you have more compose files or use different names. |
||||||
|
// The .devcontainer/docker-compose.yml file contains any overrides you need/want to make. |
||||||
|
"dockerComposeFile": [ |
||||||
|
"../docker-compose.yml", |
||||||
|
"docker-compose.yml" |
||||||
|
], |
||||||
|
|
||||||
|
// The 'service' property is the name of the service for the container that VS Code should |
||||||
|
// use. Update this value and .devcontainer/docker-compose.yml to the real service name. |
||||||
|
"service": "dev-flutter", |
||||||
|
|
||||||
|
// The optional 'workspaceFolder' property is the path VS Code should open by default when |
||||||
|
// connected. This is typically a file mount in .devcontainer/docker-compose.yml |
||||||
|
"workspaceFolder": "/projects", |
||||||
|
|
||||||
|
// Features to add to the dev container. More info: https://containers.dev/features. |
||||||
|
// "features": {}, |
||||||
|
|
||||||
|
// Use 'forwardPorts' to make a list of ports inside the container available locally. |
||||||
|
// "forwardPorts": [], |
||||||
|
|
||||||
|
// Uncomment the next line if you want start specific services in your Docker Compose config. |
||||||
|
// "runServices": [], |
||||||
|
|
||||||
|
// Uncomment the next line if you want to keep your containers running after VS Code shuts down. |
||||||
|
// "shutdownAction": "none", |
||||||
|
|
||||||
|
// Uncomment the next line to run commands after the container is created. |
||||||
|
// "postCreateCommand": "cat /etc/os-release", |
||||||
|
|
||||||
|
// Configure tool-specific properties. |
||||||
|
// "customizations": {}, |
||||||
|
|
||||||
|
// Uncomment to connect as an existing user other than the container default. More info: https://aka.ms/dev-containers-non-root. |
||||||
|
// "remoteUser": "devcontainer" |
||||||
|
|
||||||
|
"remoteUser": "developer" |
||||||
|
// "postStartCommand": ". /opt/dev-init/dev.env" |
||||||
|
} |
||||||
@ -0,0 +1,26 @@ |
|||||||
|
version: '3.8' |
||||||
|
services: |
||||||
|
# Update this to the name of the service you want to work with in your docker-compose.yml file |
||||||
|
dev-flutter: |
||||||
|
# Uncomment if you want to override the service's Dockerfile to one in the .devcontainer |
||||||
|
# folder. Note that the path of the Dockerfile and context is relative to the *primary* |
||||||
|
# docker-compose.yml file (the first in the devcontainer.json "dockerComposeFile" |
||||||
|
# array). The sample below assumes your primary file is in the root of your project. |
||||||
|
# |
||||||
|
# build: |
||||||
|
# context: . |
||||||
|
# dockerfile: .devcontainer/Dockerfile |
||||||
|
|
||||||
|
volumes: |
||||||
|
# Update this to wherever you want VS Code to mount the folder of your project |
||||||
|
- ..:/workspaces:cached |
||||||
|
|
||||||
|
# Uncomment the next four lines if you will use a ptrace-based debugger like C++, Go, and Rust. |
||||||
|
# cap_add: |
||||||
|
# - SYS_PTRACE |
||||||
|
# security_opt: |
||||||
|
# - seccomp:unconfined |
||||||
|
|
||||||
|
# Overrides default command so things don't shut down after the process ends. |
||||||
|
command: sleep infinity |
||||||
|
|
||||||
@ -0,0 +1,70 @@ |
|||||||
|
FROM debian:bookworm-20241111-slim |
||||||
|
|
||||||
|
ARG USER_UID=1000 |
||||||
|
ARG USER_GID=1000 |
||||||
|
|
||||||
|
ENV DEV_INIT_DIR=/opt/dev-init |
||||||
|
ENV JAVA_VERSION="17" |
||||||
|
|
||||||
|
# Install essential packages |
||||||
|
RUN dpkg --add-architecture i386 && \ |
||||||
|
apt-get update && \ |
||||||
|
apt-get install -y --no-install-recommends \ |
||||||
|
bash \ |
||||||
|
ca-certificates \ |
||||||
|
wget \ |
||||||
|
curl \ |
||||||
|
file \ |
||||||
|
git \ |
||||||
|
unzip \ |
||||||
|
xz-utils \ |
||||||
|
zip \ |
||||||
|
libglu1-mesa \ |
||||||
|
cmake cmake-curses-gui \ |
||||||
|
gcc g++ \ |
||||||
|
clang \ |
||||||
|
cmake cmake-curses-gui \ |
||||||
|
ninja-build pkg-config \ |
||||||
|
libgtk-3-dev liblzma-dev \ |
||||||
|
libstdc++-12-dev \ |
||||||
|
sudo \ |
||||||
|
micro \ |
||||||
|
nano \ |
||||||
|
llvm \ |
||||||
|
libclang-dev \ |
||||||
|
libc6:i386 \ |
||||||
|
libncurses5:i386 \ |
||||||
|
libstdc++6:i386 \ |
||||||
|
lib32z1 \ |
||||||
|
lib32z1-dev \ |
||||||
|
openjdk-${JAVA_VERSION}-jdk \ |
||||||
|
libpulse-java \ |
||||||
|
gosu \ |
||||||
|
&& rm -rf /var/lib/apt/lists/* |
||||||
|
|
||||||
|
ENV JAVA_HOME /usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64 |
||||||
|
|
||||||
|
# Create non-root user with specified UID and GID |
||||||
|
RUN groupadd -g ${USER_GID} developer && \ |
||||||
|
useradd -u ${USER_UID} -g ${USER_GID} -ms /bin/bash developer && \ |
||||||
|
usermod -aG sudo developer && \ |
||||||
|
echo "developer:developer" | chpasswd && \ |
||||||
|
echo 'developer ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers && \ |
||||||
|
chmod 0440 /etc/sudoers |
||||||
|
|
||||||
|
RUN curl -LO https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb |
||||||
|
RUN apt-get update -y && apt-get install -y ./google-chrome-stable_current_amd64.deb && \ |
||||||
|
rm google-chrome-stable_current_amd64.deb |
||||||
|
|
||||||
|
COPY --chown=developer:developer sample_projects /opt/sample_projects |
||||||
|
COPY dev-init dev-init $DEV_INIT_DIR |
||||||
|
RUN chmod +x $DEV_INIT_DIR/* |
||||||
|
|
||||||
|
# add group 108 (kvm group) |
||||||
|
RUN groupadd -g 108 kvm && \ |
||||||
|
usermod -aG kvm developer |
||||||
|
|
||||||
|
COPY entrypoint.sh / |
||||||
|
RUN chmod +x /entrypoint.sh |
||||||
|
|
||||||
|
ENTRYPOINT ["/entrypoint.sh"] |
||||||
@ -1,3 +1,49 @@ |
|||||||
# dev-flutter |
### Build and configure |
||||||
|
|
||||||
|
Run `docker compose build` to build the dev container. Then inside the container run selected init scripts. E.g.: |
||||||
|
|
||||||
|
``` |
||||||
|
bash /opt/dev-init/dev-init-flutter.sh |
||||||
|
bash /opt/dev-init/dev-init-rust.sh |
||||||
|
bash /opt/dev-init/dev-init-android.sh |
||||||
|
``` |
||||||
|
|
||||||
|
You can skip building the image by pulling `chodak166/dev-flutter`. |
||||||
|
|
||||||
|
Android SDK, gradle, flutter, rust and vscode data should be preserved as configured in compose file. The `/opt/dev-init/dev.env` file is also used by docker compose to setup environment variables. **See docker-compose.yml and .devcontainer/docker-compose.yml for details.** |
||||||
|
|
||||||
|
### Compile and debug the app |
||||||
|
|
||||||
|
Use `flutter create` or sample projects in `/opt/sample_projects` to perform first build and make gradle download dependencies. Then use `flutter run` to run the app. |
||||||
|
|
||||||
|
|
||||||
|
### Run and debug in VSCode |
||||||
|
|
||||||
|
With `.devcontainer` present in root project just run 'Reopen in container' command (`ctrl+shift+p`) or run `dev-flutter-01` manually with: |
||||||
|
|
||||||
|
``` |
||||||
|
docker compose run --name dev-flutter-01 -d dev-flutter |
||||||
|
``` |
||||||
|
|
||||||
|
After connecting to the container install `flutter` and `dart` tools (dart-code.flutter and dart-code.dart-code). Installing toroxx.vscode-avdmanager is also recommended for AVD management.` |
||||||
|
|
||||||
|
AVD UI, flutter commands, dev tools and debug tools should be available from your IDE. |
||||||
|
|
||||||
|
### Run and debug USB device |
||||||
|
|
||||||
|
The `fluter devices` command should identify all connected USB devices along with emulators and system targets with no problem. E.g.: |
||||||
|
|
||||||
|
``` |
||||||
|
$ flutter devices |
||||||
|
Found 5 connected devices: |
||||||
|
Armor 3 (mobile) • 3060MF1001017685 • android-arm64 • Android 8.1.0 (API 27) |
||||||
|
BV7100 (mobile) • BV7100EEA0015872 • android-arm64 • Android 12 (API 31) |
||||||
|
sdk gphone64 x86 64 (mobile) • emulator-5554 • android-x64 • Android 14 (API 34) (emulator) |
||||||
|
Linux (desktop) • linux • linux-x64 • Debian GNU/Linux 12 (bookworm) 5.15.0-125-generic |
||||||
|
Chrome (web) • chrome • web-javascript • Google Chrome 131.0.6778.85 |
||||||
|
``` |
||||||
|
export ADB_TRACE=info |
||||||
|
|
||||||
|
In case of any issues try `adb kill-server` and then `adb start-server`. Run `export ADB_TRACE=all` to see verbose output. |
||||||
|
You can also check open 5037 port with `fuser 5037/tcp`. Processes using this port can be killed with `fuser -k 5037/tcp`. |
||||||
|
|
||||||
Docker image and scripts for flutter/rust/android development in vscode. |
|
||||||
@ -0,0 +1,48 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
set -e |
||||||
|
|
||||||
|
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" |
||||||
|
|
||||||
|
source "$SCRIPT_DIR/dev.env" |
||||||
|
|
||||||
|
|
||||||
|
: ${ANDROID_SDK_ROOT:=/opt/android-sdk} |
||||||
|
: ${ANDROID_VERSION:=34} |
||||||
|
: ${ANDROID_BUILD_TOOLS_VERSION:=34.0.0} |
||||||
|
: ${ANDROID_ARCHITECTURE:=x86_64} |
||||||
|
: ${ANDROID_TOOLS_URL:="http://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip"} |
||||||
|
|
||||||
|
|
||||||
|
if [ ! -d $ANDROID_SDK_ROOT/cmdline-tools ]; then |
||||||
|
cd /tmp |
||||||
|
# Download and install Android SDK |
||||||
|
wget -c $ANDROID_TOOLS_URL -O android-sdk.zip && \ |
||||||
|
unzip android-sdk.zip -d /tmp && rm android-sdk.zip && \ |
||||||
|
mkdir -p $ANDROID_SDK_ROOT/cmdline-tools/latest && \ |
||||||
|
mv /tmp/cmdline-tools/* $ANDROID_SDK_ROOT/cmdline-tools/latest/ |
||||||
|
fi |
||||||
|
|
||||||
|
SDKMANAGER="$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" |
||||||
|
|
||||||
|
yes | $SDKMANAGER --licenses |
||||||
|
|
||||||
|
# Install SDK Platform Tools |
||||||
|
$SDKMANAGER --install "platform-tools" |
||||||
|
$SDKMANAGER --install "platforms;android-$ANDROID_VERSION" |
||||||
|
$SDKMANAGER --install "build-tools;$ANDROID_BUILD_TOOLS_VERSION" |
||||||
|
$SDKMANAGER --install "system-images;android-${ANDROID_VERSION};google_apis_playstore;${ANDROID_ARCHITECTURE}" |
||||||
|
$SDKMANAGER --install "emulator" |
||||||
|
|
||||||
|
# for vscode android plugin: |
||||||
|
mkdir -p ~/Library/Android/ ||: |
||||||
|
ln -sf /opt/android-sdk/ ~/Library/Android/sdk ||: |
||||||
|
|
||||||
|
# Build demo project |
||||||
|
"$ANDROID_SAMPLE_PROJECT/build.sh" |
||||||
|
|
||||||
|
flutter config --android-sdk $ANDROID_SDK_ROOT |
||||||
|
flutter emulators --create |
||||||
|
|
||||||
|
echo "Android development environment setup completed successfully!" |
||||||
|
|
||||||
@ -0,0 +1,38 @@ |
|||||||
|
|
||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
set -e |
||||||
|
|
||||||
|
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" |
||||||
|
|
||||||
|
source "$SCRIPT_DIR/dev.env" |
||||||
|
|
||||||
|
# Download and setup Flutter |
||||||
|
cd /tmp/ |
||||||
|
curl -v -o flutter.tar.xz https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${FLUTTER_VERSION}-stable.tar.xz |
||||||
|
tar xf flutter.tar.xz -C /tmp/ |
||||||
|
mkdir -p 2>/dev/null ${FLUTTER_ROOT}/ ||: |
||||||
|
mv /tmp/flutter/{.*,*} ${FLUTTER_ROOT}/ |
||||||
|
rm flutter.tar.xz |
||||||
|
|
||||||
|
# Configure git |
||||||
|
git config --global --add safe.directory ${FLUTTER_ROOT} |
||||||
|
|
||||||
|
# Configure Flutter |
||||||
|
flutter config --no-analytics |
||||||
|
flutter config --no-enable-android |
||||||
|
flutter config --no-enable-ios |
||||||
|
flutter config --no-enable-windows-desktop |
||||||
|
flutter config --no-enable-macos-desktop |
||||||
|
flutter config --enable-linux-desktop |
||||||
|
flutter config --enable-web |
||||||
|
|
||||||
|
# Pre-download binaries and verify installation |
||||||
|
flutter precache --linux --web |
||||||
|
flutter doctor |
||||||
|
flutter --version |
||||||
|
|
||||||
|
# Build demo project |
||||||
|
"$FLUTTER_SAMPLE_PROJECT/build.sh" |
||||||
|
|
||||||
|
echo "Flutter development environment setup completed successfully!" |
||||||
@ -0,0 +1,30 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
set -e |
||||||
|
|
||||||
|
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" |
||||||
|
|
||||||
|
source "$SCRIPT_DIR/dev.env" |
||||||
|
|
||||||
|
mkdir -p ${RUSTUP_HOME} ${CARGO_HOME} 2>/dev/null ||: |
||||||
|
|
||||||
|
cd /tmp |
||||||
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y && \ |
||||||
|
rustup default stable |
||||||
|
rustup update |
||||||
|
rustup component add rustfmt clippy |
||||||
|
rustup target add wasm32-unknown-unknown |
||||||
|
rustup toolchain install nightly |
||||||
|
rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu |
||||||
|
|
||||||
|
cargo install --version 2.6.0 flutter_rust_bridge_codegen |
||||||
|
cargo install cargo-expand |
||||||
|
cargo install wasm-pack |
||||||
|
|
||||||
|
dart pub global activate fvm |
||||||
|
dart --disable-analytics |
||||||
|
|
||||||
|
# Build demo project |
||||||
|
"$RUST_SAMPLE_PROJECT/build.sh" |
||||||
|
|
||||||
|
echo "Rust development environment setup completed successfully!" |
||||||
@ -0,0 +1,10 @@ |
|||||||
|
|
||||||
|
FLUTTER_ROOT=/opt/flutter |
||||||
|
FLUTTER_VERSION=3.22.3 |
||||||
|
FLUTTER_SAMPLE_PROJECT=/opt/sample_projects/flutter_linux_web_demo |
||||||
|
RUST_SAMPLE_PROJECT=/opt/sample_projects/flutter_rust_demo |
||||||
|
ANDROID_SAMPLE_PROJECT=/opt/sample_projects/flutter_android_demo |
||||||
|
RUSTUP_HOME=/opt/rustup |
||||||
|
CARGO_HOME=/opt/cargo |
||||||
|
ANDROID_SDK_ROOT=/opt/android-sdk |
||||||
|
PATH="${FLUTTER_ROOT}/bin:/opt/cargo/bin:$HOME/.pub-cache/bin:/opt/android-sdk/platform-tools:/opt/android-sdk/emulator:${PATH}" |
||||||
@ -0,0 +1,51 @@ |
|||||||
|
version: '3.8' |
||||||
|
services: |
||||||
|
dev-flutter: |
||||||
|
image: chodak166/dev-flutter |
||||||
|
container_name: dev-flutter-01 |
||||||
|
build: |
||||||
|
context: . |
||||||
|
args: |
||||||
|
USER_UID: ${UID:-1000} |
||||||
|
USER_GID: ${GID:-1000} |
||||||
|
network_mode: host |
||||||
|
environment: |
||||||
|
- DISPLAY=${DISPLAY} |
||||||
|
- PULSE_SERVER=unix:${XDG_RUNTIME_DIR}/pulse/native |
||||||
|
- TARGET_USER=developer |
||||||
|
env_file: dev-init/dev.env |
||||||
|
volumes: |
||||||
|
- ./volumes/projects:/projects |
||||||
|
- ./volumes/flutter:/opt/flutter |
||||||
|
- ./volumes/rustup:/opt/rustup |
||||||
|
- ./volumes/cargo:/opt/cargo |
||||||
|
- ./volumes/android-sdk:/opt/android-sdk |
||||||
|
- ./volumes/pub_cache/:/home/developer/.pub-cache |
||||||
|
- ./volumes/home_android:/home/developer/.android |
||||||
|
- ./volumes/home_gradle:/home/developer/.gradle |
||||||
|
- ./volumes/home_vscode-server:/home/developer/.vscode-server |
||||||
|
- /tmp/.X11-unix:/tmp/.X11-unix |
||||||
|
- $HOME/.Xauthority:/developer/.Xauthority |
||||||
|
- ${XDG_RUNTIME_DIR}/pulse:${XDG_RUNTIME_DIR}/pulse |
||||||
|
- /run/user/1000/at-spi:/run/user/1000/at-spi #TODO: pass UID? |
||||||
|
- /dev/shm:/dev/shm |
||||||
|
- ./dev-init:/opt/dev-init # debug |
||||||
|
- .:/host # debug |
||||||
|
|
||||||
|
devices: |
||||||
|
- /dev/dri:/dev/dri |
||||||
|
- /dev/usb:/dev/usb |
||||||
|
- /dev/udev:/dev/udev |
||||||
|
- /dev/bus:/dev/bus |
||||||
|
- /dev/kvm:/dev/kvm |
||||||
|
- /dev/snd:/dev/snd |
||||||
|
security_opt: |
||||||
|
- seccomp:unconfined |
||||||
|
privileged: true |
||||||
|
cap_add: |
||||||
|
- SYS_ADMIN |
||||||
|
- NET_ADMIN |
||||||
|
- SYS_PTRACE |
||||||
|
stdin_open: true |
||||||
|
tty: true |
||||||
|
init: true |
||||||
@ -0,0 +1,45 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
# Exit on error |
||||||
|
set -e |
||||||
|
|
||||||
|
set -a |
||||||
|
. $DEV_INIT_DIR/dev.env |
||||||
|
set +a |
||||||
|
|
||||||
|
# Check if TARGET_USER is set |
||||||
|
if [ -z "$TARGET_USER" ]; then |
||||||
|
echo "ERROR: TARGET_USER environment variable is not set" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
targetHome=$(getent passwd $TARGET_USER | cut -f6 -d:) |
||||||
|
targetUid=$(id -u $TARGET_USER) |
||||||
|
|
||||||
|
if [ -z "$TARGET_USER" ]; then |
||||||
|
echo "ERROR: Cannot parse home directory for user $TARGET_USER" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
# Change ownership of the specified directories |
||||||
|
chown -R $TARGET_USER: $ANDROID_SDK_ROOT |
||||||
|
chown -R $TARGET_USER: $targetHome/.gradle |
||||||
|
chown -R $TARGET_USER: $targetHome/.android |
||||||
|
chown -R $TARGET_USER: $targetHome/.pub-cache |
||||||
|
chown -R $TARGET_USER: $targetHome/.vscode-server |
||||||
|
chown -R $TARGET_USER: /opt/flutter |
||||||
|
chown -R $TARGET_USER: /opt/rustup |
||||||
|
chown -R $TARGET_USER: /opt/cargo |
||||||
|
chown -R $TARGET_USER: /projects |
||||||
|
|
||||||
|
# fix |
||||||
|
chown -R $TARGET_USER: /run/user/$targetUid |
||||||
|
# chmod 777 /dev/kvm |
||||||
|
|
||||||
|
# If command line arguments are provided, run them as TARGET_USER |
||||||
|
# Otherwise, run bash as TARGET_USER |
||||||
|
if [ $# -eq 0 ]; then |
||||||
|
exec gosu $TARGET_USER bash |
||||||
|
else |
||||||
|
exec gosu $TARGET_USER "$@" |
||||||
|
fi |
||||||
@ -0,0 +1,48 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
set -e # Exit on error |
||||||
|
set -x # Print commands being executed |
||||||
|
|
||||||
|
cd "$(dirname "$0")" |
||||||
|
|
||||||
|
# Enable builds |
||||||
|
# flutter config --enable-linux-desktop |
||||||
|
# flutter config --enable-web |
||||||
|
flutter config --enable-android |
||||||
|
|
||||||
|
if [ ! -f lib/main.dart ]; then |
||||||
|
flutter create -t app . |
||||||
|
flutter_rust_bridge_codegen integrate |
||||||
|
fi |
||||||
|
|
||||||
|
# Create project structure (this will add platform-specific files) |
||||||
|
# flutter create . |
||||||
|
|
||||||
|
# Get dependencies |
||||||
|
# flutter pub get |
||||||
|
|
||||||
|
# Build Rust project first |
||||||
|
# cd rust |
||||||
|
# cargo build --release |
||||||
|
# cd .. |
||||||
|
|
||||||
|
# Generate Flutter Rust Bridge bindings using config file |
||||||
|
flutter_rust_bridge_codegen generate |
||||||
|
|
||||||
|
# Build Linux version |
||||||
|
# flutter build linux --release |
||||||
|
|
||||||
|
# cp target/release/libnative.so build/linux/x64/release/bundle/lib/ |
||||||
|
|
||||||
|
# For web, we need to build the Rust code for wasm target |
||||||
|
# cd rust |
||||||
|
# rustup target add wasm32-unknown-unknown |
||||||
|
# cargo build --release --target wasm32-unknown-unknown |
||||||
|
# cd .. |
||||||
|
|
||||||
|
# Build Web version |
||||||
|
# flutter build web --release |
||||||
|
# flutter_rust_bridge_codegen build-web |
||||||
|
|
||||||
|
flutter build apk --verbose |
||||||
|
|
||||||
@ -0,0 +1,18 @@ |
|||||||
|
#!/bin/bash |
||||||
|
cd "$(dirname "$0")" |
||||||
|
|
||||||
|
# Enable Linux and Web builds |
||||||
|
flutter config --enable-linux-desktop |
||||||
|
flutter config --enable-web |
||||||
|
|
||||||
|
# Create project structure (this will add platform-specific files) |
||||||
|
flutter create . |
||||||
|
|
||||||
|
# Get dependencies |
||||||
|
flutter pub get |
||||||
|
|
||||||
|
# Build Linux version |
||||||
|
flutter build linux --release |
||||||
|
|
||||||
|
# Build Web version |
||||||
|
flutter build web --release |
||||||
@ -0,0 +1,41 @@ |
|||||||
|
import 'package:flutter/material.dart'; |
||||||
|
|
||||||
|
void main() { |
||||||
|
runApp(const MyApp()); |
||||||
|
} |
||||||
|
|
||||||
|
class MyApp extends StatelessWidget { |
||||||
|
const MyApp({super.key}); |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
return MaterialApp( |
||||||
|
title: 'Flutter Linux & Web Demo', |
||||||
|
theme: ThemeData( |
||||||
|
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), |
||||||
|
useMaterial3: true, |
||||||
|
), |
||||||
|
home: const MyHomePage(), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class MyHomePage extends StatelessWidget { |
||||||
|
const MyHomePage({super.key}); |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
return Scaffold( |
||||||
|
appBar: AppBar( |
||||||
|
backgroundColor: Theme.of(context).colorScheme.inversePrimary, |
||||||
|
title: const Text('Flutter Linux & Web Demo'), |
||||||
|
), |
||||||
|
body: const Center( |
||||||
|
child: Text( |
||||||
|
'Hello, World!', |
||||||
|
style: TextStyle(fontSize: 24), |
||||||
|
), |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,20 @@ |
|||||||
|
name: flutter_linux_web_demo |
||||||
|
description: A Flutter demo project for Linux and Web platforms |
||||||
|
publish_to: 'none' |
||||||
|
version: 1.0.0+1 |
||||||
|
|
||||||
|
environment: |
||||||
|
sdk: '>=3.0.0 <4.0.0' |
||||||
|
|
||||||
|
dependencies: |
||||||
|
flutter: |
||||||
|
sdk: flutter |
||||||
|
cupertino_icons: ^1.0.2 |
||||||
|
|
||||||
|
dev_dependencies: |
||||||
|
flutter_test: |
||||||
|
sdk: flutter |
||||||
|
flutter_lints: ^2.0.0 |
||||||
|
|
||||||
|
flutter: |
||||||
|
uses-material-design: true |
||||||
@ -0,0 +1,43 @@ |
|||||||
|
#!/bin/bash |
||||||
|
cd "$(dirname "$0")" |
||||||
|
|
||||||
|
if [ ! -f lib/main.dart ]; then |
||||||
|
flutter create . |
||||||
|
flutter_rust_bridge_codegen integrate |
||||||
|
fi |
||||||
|
|
||||||
|
set -e # Exit on error |
||||||
|
set -x # Print commands being executed |
||||||
|
|
||||||
|
# Enable Linux and Web builds |
||||||
|
flutter config --enable-linux-desktop |
||||||
|
flutter config --enable-web |
||||||
|
|
||||||
|
# Create project structure (this will add platform-specific files) |
||||||
|
# flutter create . |
||||||
|
|
||||||
|
# Get dependencies |
||||||
|
flutter pub get |
||||||
|
|
||||||
|
# Build Rust project first |
||||||
|
# cd rust |
||||||
|
# cargo build --release |
||||||
|
# cd .. |
||||||
|
|
||||||
|
# Generate Flutter Rust Bridge bindings using config file |
||||||
|
flutter_rust_bridge_codegen generate |
||||||
|
|
||||||
|
# Build Linux version |
||||||
|
flutter build linux --release |
||||||
|
# cp target/release/libnative.so build/linux/x64/release/bundle/lib/ |
||||||
|
|
||||||
|
# For web, we need to build the Rust code for wasm target |
||||||
|
# cd rust |
||||||
|
# rustup target add wasm32-unknown-unknown |
||||||
|
# cargo build --release --target wasm32-unknown-unknown |
||||||
|
# cd .. |
||||||
|
|
||||||
|
# Build Web version |
||||||
|
# flutter build web --release |
||||||
|
flutter_rust_bridge_codegen build-web |
||||||
|
cp -r web/pkg build/web/ |
||||||
Loading…
Reference in new issue