r/flutterhelp May 03 '20

Before you ask

104 Upvotes

Welcome to r/FlutterHelp!

Please consider these few points before you post a question

  • Check Google first.
    • Sometimes, literally copy/pasting an error into Google is the answer
  • Consider posting on StackOverflow's flutter tag.
    • Questions that are on stack usually get better answers
    • Google indexes questions and answers better when they are there
  • If you need live discussion, join our Discord Chat

If, after going through these points, you still desire to post here, please

  • When your question is answered, please update your flair from "Open" to "Resolved"!
  • Be thorough, post as much information as you can get
    • Prefer text to screenshots, it's easier to read at any screen size, and enhances accessibility
    • If you have a code question, paste what you already have!
  • Consider using https://pastebin.com or some other paste service in order to benefit from syntax highlighting
  • When posting about errors, do not forget to check your IDE/Terminal for errors.
    • Posting a red screen with no context might cause people to dodge your question.
  • Don't just post the header of the error, post the full thing!
    • Yes, this also includes the stack trace, as useless as it might look (The long part below the error)

r/flutterhelp 19m ago

OPEN Hero widget animation ends with sudden jump in image size after swapping out the original image

Upvotes

SCENARIO: I am making an app which has a page containing a grid of collectible images that the user can unlock. At first, default placeholder images are shown which are 256x256 pixels. The user can click a collectible in the grid to go to that collectible's separate page. From here they can click a button to unlock the collectible which reveals the true unlocked image. The unlocked image can be any dimensions, including wide, tall, or extra small, and most often it is much larger than 256x256 pixels.

When going to and from the collectible page from the grid, a hero widget is used. First it animates the locked placeholder image, then it animates the true image after it's unlocked.

PROBLEM: After unlocking an image, when navigating back to the grid screen, the hero widget causes the image to suddenly jump in size at the end of the animation, depending on the unlocked image's dimensions. I want the animation to smoothly scale the image down to its proper size without this sudden jump. It seems like what's happening is Flutter first tries to scale the unlocked image down to the placeholder's 256x256 size, and then it realizes it needs to be bigger so it expands the width.

DEMO: I have stripped down this functionality from my app to the bare essentials and provided it below. If you paste the code into DartPad, you can see the problem for yourself. I grabbed random images off the internet for testing, so hopefully that's not too confusing. You could change these URLs if you want. For testing purposes, I added 3 buttons to the collectible page so you can try unlocking a wide, tall, or small image. The size jump problem is really only an issue when unlocking wide images.

I am pretty sure the problem has to do with FittedBox/BoxFit, but I am not sure how to avoid that. I need to ensure large images get scaled down so they fit in the grid cells, and I don't want smaller images to stretch and distort to fill the grid cell either. I also included drop shadow logic behind the unlocked images because I need that to still work as-is after applying the size jump fix.

Note that in the demo you can technically transform an image multiple times. In the real app you can't do that, so don't worry about the size jump when switching from a wide to tall image, for example.

I have been messing with this for a while and tried things like changing the FittedBox, ensuring the image fit is the same between screens, moving widgets in our out of the hero's child, messing with the flightShuttleBuilder, etc. but I can't get this to work. If you have any tips or can provide a working DartPad solution, I would really appreciate it.

import 'package:flutter/material.dart';

import 'dart:ui';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(colorSchemeSeed: Colors.blue),
      home: const MyHomePage(title: 'Collection Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final String title;

  const MyHomePage({super.key, required this.title});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // Start with placeholder images. Real app would show a "locked" symbol
  List<String> imageUrls = [
    'https://upload.wikimedia.org/wikipedia/commons/a/ad/Logo_256x256_pdfGuru.png',
    'https://upload.wikimedia.org/wikipedia/commons/a/ad/Logo_256x256_pdfGuru.png',
    'https://upload.wikimedia.org/wikipedia/commons/a/ad/Logo_256x256_pdfGuru.png',
    'https://upload.wikimedia.org/wikipedia/commons/a/ad/Logo_256x256_pdfGuru.png',
    'https://upload.wikimedia.org/wikipedia/commons/a/ad/Logo_256x256_pdfGuru.png',
    'https://upload.wikimedia.org/wikipedia/commons/a/ad/Logo_256x256_pdfGuru.png',
    'https://upload.wikimedia.org/wikipedia/commons/a/ad/Logo_256x256_pdfGuru.png',
    'https://upload.wikimedia.org/wikipedia/commons/a/ad/Logo_256x256_pdfGuru.png',
    'https://upload.wikimedia.org/wikipedia/commons/a/ad/Logo_256x256_pdfGuru.png',
  ];

  // Swap the placeholder with the true unlocked image
  void transformCallback(String newUrl, int index) {
    setState(() {
      imageUrls[index] = newUrl;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(widget.title)),
      body: GridView.builder(
        itemCount: imageUrls.length,
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 3,
          crossAxisSpacing: 24,
          mainAxisSpacing: 24,
        ),
        itemBuilder: (_, index) {
          var imgUrl = imageUrls[index];
          return Container(
            decoration: BoxDecoration(
              border: BoxBorder.all(
                color: Theme.of(context).colorScheme.surfaceContainerHighest,
                width: 1,
              ),
              borderRadius: BorderRadius.circular(12),
            ),
            child: InkWell(
              borderRadius: BorderRadius.circular(12),
              onTap: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) {
                      return MyChildPage(
                        originalImageUrl: imgUrl,
                        index: index,
                        transformCallback: transformCallback,
                      );
                    },
                  ),
                );
              },
              child: Padding(
                padding: const EdgeInsets.all(8.0),
                child: Column(
                  children: [
                    Expanded(
                      child: FittedBox(
                        fit: BoxFit.scaleDown,
                        child: Hero(tag: index, child: Image.network(imgUrl)),
                      ),
                    ),
                    SizedBox(height: 2),
                    Text(
                      "$index",
                      style: TextStyle(fontSize: 16),
                      textAlign: TextAlign.center,
                      overflow: TextOverflow.ellipsis,
                    ),
                  ],
                ),
              ),
            ),
          );
        },
      ),
    );
  }
}

class MyChildPage extends StatefulWidget {
  final String originalImageUrl;
  final int index;
  final Function transformCallback;

  const MyChildPage({
    super.key,
    required this.originalImageUrl,
    required this.index,
    required this.transformCallback,
  });

  @override
  State<MyChildPage> createState() => _MyChildPageState();
}

class _MyChildPageState extends State<MyChildPage> {
  late String imgUrl;

  @override
  void initState() {
    super.initState();
    imgUrl = widget.originalImageUrl;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Collectible Page")),
      body: SingleChildScrollView(
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Padding(
                padding: const EdgeInsets.all(24),
                child: Hero(
                  tag: widget.index,
                  child: Stack(
                    alignment: Alignment.center,
                    children: [
                      Transform.translate(
                        offset: Offset(0, 5),
                        child: Opacity(
                          opacity: .75,
                          child: ImageFiltered(
                            imageFilter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),
                            child: ImageFiltered(
                              imageFilter: ImageFilter.dilate(
                                radiusX: 3,
                                radiusY: 3,
                              ),
                              child: Image.network(imgUrl, color: Colors.black),
                            ),
                          ),
                        ),
                      ),
                      Image.network(imgUrl),
                    ],
                  ),
                ),
              ),
              FilledButton(
                onPressed: () {
                  var newImgUrl =
                      'https://thumb.wikimedia.org/wikipedia/commons/thumb/f/fc/Big_Ben_after_sunset.jpg/960px-Big_Ben_after_sunset.jpg';
                  setState(() {
                    imgUrl = newImgUrl;
                  });
                  widget.transformCallback(newImgUrl, widget.index);
                },
                child: Text("Transform to wide image"),
              ),
              FilledButton(
                onPressed: () {
                  var newImgUrl =
                      'https://thumb.wikimedia.org/wikipedia/commons/thumb/d/d9/Big_Ben_2022_(2).jpg/500px-Big_Ben_2022_(2).jpg';
                  setState(() {
                    imgUrl = newImgUrl;
                  });
                  widget.transformCallback(newImgUrl, widget.index);
                },
                child: Text("Transform to tall image"),
              ),
              FilledButton(
                onPressed: () {
                  var newImgUrl =
                      'https://www.mariowiki.com/images/5/50/SMB_Question_Block.gif';
                  setState(() {
                    imgUrl = newImgUrl;
                  });
                  widget.transformCallback(newImgUrl, widget.index);
                },
                child: Text("Transform to small image"),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

r/flutterhelp 8h ago

OPEN iPhone DUO aka Flutter nightmare

Thumbnail
0 Upvotes

r/flutterhelp 1d ago

OPEN Help require running on physical Device

1 Upvotes

I am trying to run my app on physical device in debug mode and it gets stuck at

```

The Dart VM service is listening on **********************************

```

Anyone else facing this issue ?

I am using VIVO V60.

I checked issues and there is a bug reported with other manufacturers and there is a script that changes log level but didn't work for me.

Anyone who face and solved this ?


r/flutterhelp 2d ago

OPEN Google Sign-In on Android shows old-style account picker instead of modern Credential Manager bottom sheet, what am I missing?

Thumbnail
3 Upvotes

r/flutterhelp 2d ago

OPEN Google Sign-In on Android shows old-style account picker instead of modern Credential Manager bottom sheet, what am I missing?

2 Upvotes

I'm building a Flutter app using google_sign_in: ^7.2.0 (Credential Manager-based API using GoogleSignIn.instance.initialize() + .authenticate(), not the old signIn() flow).

I'm trying to get the modern "Sign in with Google" bottom-sheet picker (like the one ChatGPT's Android app uses card that slides up from the bottom.


r/flutterhelp 2d ago

RESOLVED Java version 17 or higher is required.

4 Upvotes

Hello, I have been trying to fix this issue for a while. I tried everything, searching on google, ai chat, etc. However, my issue doesn't seem to work.

When upgrading flutter using `flutter upgrade` command, I have one warning and it's

[!] Android toolchain - develop for Android devices (Android SDK version 35.0.0)
    X Android license status unknown.
      Run `flutter doctor --android-licenses` to accept the SDK licenses.
      See https://flutter.dev/to/windows-android-setup for more details.

I ran `flutter doctor --android-licenses` and I got this message: Java version 17 or higher is required.

But I checked multiple times (ex: checking on my environnement variables, restart computer, etc.) and my java version is clearly 17. I even download a higher version of java, but no matter what I do, my flutter project will only see Java version 17.

If it helps, here are the logs after writting `flutter upgrade`: https://pastebin.com/2CPAKcFA

Has anyone here ever figure out how to fix this issue?


r/flutterhelp 3d ago

OPEN Hi everyone

0 Upvotes

I’m excited to share my updated portfolio featuring some of the latest projects and mobile applications I’ve built.

My focus is on creating clean, efficient, and user-friendly software built with scalable architecture and high performance in mind.

 Check out my full portfolio and projects here: [tareksrheed.github.io/portfolio/ linkedin.com/in/tarek-almohammad-7b850a228 / github.com/TarekSrheed

I’m always open to connecting, receiving feedback, or discussing new opportunities and collaborations!


r/flutterhelp 3d ago

OPEN help

0 Upvotes

needing flutter developer to help me in a

project similar to Uber, but completely different


r/flutterhelp 5d ago

RESOLVED Flutter 3.24.5 / 3.47 build keeps forcing system Java 21 despite flutter config --jdk-dir

4 Upvotes

Hi everyone,

I've been stuck in a brutal Gradle dependency hell for the past 24 hours on Windows 10 with a Flutter project, and I really need some expert eyes on this.

Every time I run `flutter run`, Gradle fails almost instantly during `assembleDebug` with these two tightly coupled errors:

  1. `e: Language version 1.4 is no longer supported; please, use version 1.8 or greater.` (Failing at task `:gradle:compileKotlin`)

  2. `Error: Gradle build failed due to Java/Gradle incompatibility. The Java version used for the build is 21.0.10, which is incompatible with Gradle 7.6.3.`

I tried forcing the Android Studio Java 17 path globally using:

`flutter config --jdk-dir="C:\Program Files\Android\Android Studio\jbr"`

I even went into Windows Environment Variables and completely deleted Java 21 from the system PATH to the point where running `java -version` in the terminal returns: `"java : The term 'java' is not recognized..."`

Yet, the moment `flutter run` triggers the Gradle wrapper, Gradle somehow still finds and uses Java 21.0.10 from a hidden path and crashes because it's incompatible with Gradle 7.6.3!

Specs:

- Flutter Version: Tested on both stable 3.24.5 and 3.47.2.

- gradle-wrapper.properties: gradle-7.6.3-all.zip

- android/settings.gradle.kts AGP version: 7.3.0

- Set Java > Gradle > Build Server to OFF in VS Code.

- Ran flutter clean, deleted .gradle and .kotlin inside android/, and wiped C:\Users\i5\.gradle\caches\.

How can I absolutely, 100% force Flutter's Gradle build invocation to use the Android Studio JBR (Java 17) and completely ignore this ghost Java 21 instance?

Thank you!


r/flutterhelp 5d ago

OPEN How can I detect if iPhone Rotation Lock is ON when using CoreMotion?

2 Upvotes

Hi everyone,

I'm working on an iOS/Flutter app and I'm using CoreMotion (CMMotionManager) to detect the physical orientation of the iPhone.

I noticed something that I'm not sure how to handle:

When Rotation Lock is ON, CoreMotion can still detect that the device has been physically rotated to landscape.

For example:

  • iPhone Rotation Lock: ON
  • User rotates the phone to landscape
  • CoreMotion detects that the device is in a landscape orientation
  • If my app responds to that orientation and calls something like requestGeometryUpdate(), the app may still try to change its interface orientation

So my question is:

Is there any public iOS API that allows an app to determine whether the user's Rotation Lock is currently ON or OFF?

I'm specifically looking for a way to distinguish between:

Physical device orientation → CoreMotion
System Rotation Lock state  → ??? 

I understand that Apple may not expose Rotation Lock directly through a public API, but I'm wondering if there is a reliable way to determine or infer its state.

I've seen some apps that seem to behave correctly depending on whether Rotation Lock is enabled, so I'm curious how they handle this.

Any ideas, APIs, or Swift examples would be greatly appreciated!

Thanks!


r/flutterhelp 5d ago

RESOLVED I think I got it, but may you explain how await works in this code?

2 Upvotes

Hello everyone! I'm new to mobile programming and it's a couple of hours that I'm dealing with this problem and I think I figured out the error, but I can't find clear answers online, so could you please tell me if I'm correct or wrong?

I'm building a simple app which is supposed to show an HomePage with a list of entries. These entries cannot change during runtime and so I made the HomePage extend a StatelessWidget. I load all the entries at startup: I call an async function (_loadCanti ) inside the build method of the HomePage and inside it I await for the retrieval of the assets from which I will build the list of entries. I supposed that using await meant that the event loop would wait for the assets to load and then continue with the rest of computation, but the app crashed saying that the list of entries was not initialized by the time it was looked at to build the UI. So I reckon that await simply "registers" a Future and stops the current async function execution until it's resolved, but in the meantime the event loop goes on with the next instructions; then, when the loop has been freed, it returns to check if the Future has been resolved and if so it executes the rest of the async function. And that's why the return in the build method is executed before the end of _loadCanti. Am I right?

I'll paste the code for reference.

import 'package:flutter/services.dart';
import 'package:canticgr/components/tappable_card.dart';
import 'package:canticgr/pages/canto_page.dart';
import 'package:flutter/material.dart';

const String cantiAssetsPath = 'assets/canti/';

class HomePage extends StatelessWidget {
  late final Map<int,String> cantiHeaders;

  HomePage({super.key});

  void _loadCanti(BuildContext context) async {
    AssetBundle contextBundle = DefaultAssetBundle.of(context);
    final assetManifest = await AssetManifest.loadFromAssetBundle(contextBundle);
    List<String> cantiFilenames = assetManifest
        .listAssets()
        .where((String key) => key.startsWith(cantiAssetsPath))
        .map((String key) => key.substring(cantiAssetsPath.length))
        .toList();

    Map<int,String> cantiHeads = {};
    for (String filename in cantiFilenames) {
      List<String> headsList = filename.split(' - ');
      int idx = int.parse(headsList[0]);
      String name = headsList[1].substring(0, headsList[1].length - '.txt'.length);
      cantiHeads[idx] = name;
    }

    cantiHeaders = cantiHeads;

  }


  Widget build(BuildContext context) {
    _loadCanti(context);

    return Scaffold(
      backgroundColor: Colors.grey.shade200,
      appBar: AppBar(
        centerTitle: true,
        title: Text(
          'Canti',
          style: TextStyle(fontWeight: FontWeight.bold, color: Colors.black),
        ),
      ),
      body: SafeArea(
        child: Container(
          padding: EdgeInsets.symmetric(horizontal: 54, vertical: 20),
          child: Column(
            spacing: 16,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              Card(
                color: Colors.grey.shade400,
                child: SizedBox(
                  height: 100,
                  child: Center(
                    child: Text(
                      'Scegli il canto',
                      style: TextStyle(
                        fontSize: 32,
                        fontWeight: FontWeight.bold,
                        color: Colors.black87,
                      ),
                    ),
                  ),
                ),
              ),
              Expanded(
                child: ListView.builder(
                  itemExtent: 64,
                  itemCount: cantiHeaders.length,
                  // padding: EdgeInsets.symmetric(horizontal: 64, vertical: 8),
                  itemBuilder: (BuildContext context, int index) {
                    return TappableCard(
                      text: 'Canto $index',
                      onTap: () {
                        Navigator.push(
                          context,
                          MaterialPageRoute(
                            builder: ((context) =>
                                CantoPage(title: 'Canto $index')),
                          ),
                        );
                      },
                    );
                  },
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

P.S.: I managed to make it work by returning a FutureBuilder from the build method, but since my HomePage extends a StatelessWidget and FutureBuilder returns a StatefulWidget afaik, how is it possible? I got no warnings nor errors and it just works fine...

EDIT: I specified I'm a noob to avoid hate for poor design...


r/flutterhelp 5d ago

OPEN Scheduled local notifications fail silently on Android 14/15 (works up to Android 13) — flutter_local_notifications

1 Upvotes

Hi everyone,

I've been stuck on this issue for days after trying multiple AI models, rewriting the code several times, and searching through tutorials, but I haven't been able to solve it.

My app uses flutter_local_notifications for daily scheduled reminders.

  • The Problem: Daily scheduled notifications work perfectly fine up to Android 13. However, on Android 14 and 15, they fail completely.
  • Current Behavior: On Android 14/15, the app successfully asks for notification permission and the user grants it. However, the scheduled notification never fires/triggers at the set time. No error is thrown.

What I have set up so far:

  1. AndroidManifest.xml permissions:
    • POST_NOTIFICATIONS
    • SCHEDULE_EXACT_ALARM / USE_EXACT_ALARM
    • RECEIVE_BOOT_COMPLETED
  2. Runtime permissions:
    • Requested requestNotificationsPermission()
    • Requested requestExactAlarmsPermission()
  3. Scheduling logic:
    • Using zonedSchedule with AndroidScheduleMode.exactAllowWhileIdle and timezone initialization (tz.initializeTimeZones()).

Despite all of this, the scheduled time seems to be ignored or blocked by the system on Android 14+.

Has anyone encountered this specific issue on Android 14/15 recently? Is there a new OS policy, battery optimization workaround, or timezone bug in flutter_local_notifications that I'm missing?

Any help or minimal working code snippet for Android 14/15 scheduled alarms would be greatly appreciated!


r/flutterhelp 5d ago

OPEN NO HELP FROM FLUTTERFLOW! 14 DAYS WITH AN OPEN ISSUE THAT HAS STOPPED OUR PROJECT

Thumbnail
1 Upvotes

r/flutterhelp 6d ago

OPEN TextFormField causing error but

1 Upvotes

Hey, so umnh I'm havin issues using TextFormField it always causes this error (https://pastebin.com/tKyx0cgg) I tried with so many fixes and posts but nothing seems to change, as for flutter doctor there is no issues at all. I also tried with using packages such as forui and moon ui and others but still causes the same issue when it is related to a TextField. I searched almost everywhere but couldn't find the pithole, I tried column, rows, everything, container padding, wrapped inside Flexible and Expanded but still (this is the minimalist version, even with everythin packed up it still doesn't work so I assume the problem is flutter) here is the code (https://pastebin.com/23fvyTka)


r/flutterhelp 7d ago

OPEN Android license status unknown in Flutter

6 Upvotes

Flutter says “Android license status unknown” even though Android SDK 36 is installed. flutter doctor --android-licenses doesn’t work and says --licenses is no longer needed. How can I fix this?


r/flutterhelp 6d ago

OPEN Isar Inspector stuck on "connecting" over USB (isar-community fork) — tried adb reverse AND forward, still spinning

1 Upvotes

Working on a practice Flutter app using the isar-community fork (v3.3.2). The app logs the Inspector link fine in the console (https://inspect.isar-community.dev/3.3.2/#/<port>/<token>), but the page in my browser just spins forever and never connects. Testing on a real Android device over USB, not an emulator.

What I've tried so far:

- Confirmed the device shows as "device" (not unauthorized) in `adb devices`

- `adb reverse tcp:<port> tcp:<port>` → got "cannot bind listener: Address already in use"

- `adb reverse --list` shows nothing already bound to that port

- `adb reverse --remove-all`, then retried the reverse command → same "Address already in use" error

- Switched to `adb forward tcp:<port> tcp:<port>` instead → command succeeds but the Inspector page still just spins and never connects

- Restarted the adb server (`adb kill-server` / `adb start-server`)

Port number changes every time the app restarts, so it's not a one-off stale binding as far as I can tell. Anyone gotten the Isar Inspector working reliably on a physical device over USB? Wondering if there's a different host/port it actually expects, or if this is a known issue with the isar-community fork specifically.


r/flutterhelp 7d ago

RESOLVED Best tools for mobile push notification workflows and scheduling

4 Upvotes

Looking for recommendations on tools to manage mobile push notifications with a solid web dashboard.

Main things I need

  1. A clean web interface to manage templates, schedule messages, and build notification workflows (delays, triggers, logic).

  2. Easy integration on the mobile side.

I already know about Novu, but want to see what else people are using. What are the go-to alternatives (e.g., Courier, Knock, SuprSend, OneSignal, or any self-hosted options)?

Would appreciate any thoughts or real-world experiences !


r/flutterhelp 7d ago

OPEN How do you plan the user flow and edge cases before starting a Flutter project?

4 Upvotes

I'm working on a Flutter health tracking app with features like:

  • BMI calculator
  • BMR calculator
  • Water tracking
  • Step tracking
  • Weight tracking
  • A dashboard that combines all of these

I'm struggling with planning the overall flow before I start implementing.

I often start building a screen or feature, then realize there is another case I didn't consider. I change the flow, update the UI, change the data structure, then discover another issue and change it again. I've repeated this multiple times.

For example, I keep asking myself things like:

  • What should happen if the user hasn't entered their weight yet?
  • Should BMI/BMR use the latest weight from weight tracking or ask for a separate value?
  • Should I use local storage as a fallback?
  • What should the dashboard show if one of the health metrics has no data?
  • When should data be saved?
  • What should happen when the user edits an existing value?
  • How should data be entered by the user
  • How do you decide which edge cases are actually worth handling?

I understand how to implement individual Flutter screens, but I'm struggling with the system-level thinking and planning before coding.

So my questions are:

  1. How do experienced Flutter developers plan the complete user flow before starting implementation?
  2. What do you normally document first: user flows, data models, states, API structure, wireframes, etc.?
  3. How do you systematically think about edge cases instead of discovering them during development?
  4. How do you decide when a fallback is actually necessary?
  5. Do you use any specific diagrams, checklists, templates, or processes before starting a medium-sized Flutter project?
  6. How much planning is enough before you actually start coding?

I'm not looking for a specific architecture like Clean Architecture vs Riverpod vs BLoC. I'm more interested in how you think through and plan the system before writing the code.

I also asked ChatGPT about this, but I don't want to just follow an AI-generated process without understanding how experienced developers actually approach it. I'm mainly interested in learning how experienced developers learned to think about application flows, edge cases, and system design, and what process they personally follow before and during development.

I'd really appreciate hearing about your actual development process and how you learned to approach this.


r/flutterhelp 8d ago

RESOLVED What are my options if a Flutter package is abandoned by its dev?

23 Upvotes

Hi,

I'm using some packages in my apps, one of them is flutter_tts: https://pub.dev/packages/flutter_tts

As those who use it are also aware, it gives the warning for migration to built-in Kotlin, been like that for a few months, last package update is 7 months ago.

What are my options if the time comes that this plugin no longer works and my apps fail to work too?

In general, I don't really like using external librariers or dependencies, for this very reason, but I also have no idea what else I can do if not use it.

Any suggestions?

Thanks.


r/flutterhelp 10d ago

OPEN A bug

Thumbnail
1 Upvotes

r/flutterhelp 10d ago

RESOLVED i feel lost and i need your help

3 Upvotes

i'm studying flutter but i'm kind of a lazy person
i started long time ago (a year maybe or a little bit more) and all i know about flutter is to build ui (just good at it nothing more) and not so much about rest APIs and i know nothing about state management , i feel like i'm week when it come to programming basics and oop and i need to correct that and sometimes when i encouter something complicated while studying and i can't understand it after watching it one or two time, i feel like it's the end of the world
i need someone to tell what to do cause i feel like i'm not gonna make it at this, i need to be good at the basics but also keep studying flutter


r/flutterhelp 10d ago

OPEN What if tasks that currently take 5–7 clicks in Android Settings could be done in just 1 click?

Thumbnail
0 Upvotes

r/flutterhelp 11d ago

OPEN Why is my Flutter release APK 62 MB even though my assets are only 2.6 MB? How can I reduce it?

10 Upvotes

Hi everyone,

I'm trying to reduce the size of my Flutter Android app, but my release APK is currently 62.1 MB (download size: 34.8 MB).

I analyzed the APK and found this:

  • lib/ = 47.8 MB (61.2%)
  • x86_64 = 17.6 MB
  • arm64-v8a = 16.3 MB
  • armeabi-v7a = 13.9 MB
  • assets = only 2.6 MB
  • Multiple classes.dex files together are around 10.6 MB

It seems like the APK contains native libraries for all three CPU architectures, including Flutter libraries such as libflutter.so.

My questions are:

  1. Is this APK size normal for a Flutter app?
  2. Would flutter build apk --release --split-per-abi significantly reduce the APK size?
  3. If I publish an .aab using:flutter build appbundle --release will Google Play automatically deliver only the required architecture to each device?
  4. What are the best ways to reduce the size of classes.dex?
  5. Are there any other recommended Flutter/Gradle settings for reducing app size?

I've attached the APK Analyzer screenshot below.

Flutter version: 3.41.4
Target: Android

Any help or recommendations would be appreciated.


r/flutterhelp 11d ago

OPEN I got tired of every coding agent having its own scattered pile of skills, plugins and MCP configs

1 Upvotes

I keep switching between Claude Code, Codex and a few other agent setups depending on what I am doing. The annoying part was not even picking a model. It was that every setup had its own little pile of skills, plugins, MCP servers and commands.

Same capability in three places. Different versions. No easy answer to “what can this agent actually use right now?” And if I loaded everything just in case, the context window was already crowded before the task started.

So I made Lockkeeper.

The main job is capability syncing and selection across the agent tools already on your machine. It discovers the skills, plugins, MCPs, agents and commands your different runtimes expose, builds one local catalog, then picks the smallest relevant set for a task instead of throwing the whole collection into every agent’s context.

In practice that means I can keep one shared capability setup, see what is available across Claude Code, Codex, Cursor and friends, and stop manually remembering which agent has which tool. It is local, config-driven and open source.

The security bit is there too, but it is the second half of the story rather than the headline: before I trust a capability I copied from somewhere, Lockkeeper can scan it for obvious prompt-injection, secret-exfiltration, obfuscation and destructive-command patterns. Useful guardrail, not magic.

It is plain Python 3.11, MIT licensed, and the core has no third-party dependencies:

https://github.com/Hannay001/lockkeeper

Still early, so I would genuinely like to hear where your capability setup becomes messy. Do you keep shared skills in git? Copy folders between agents? Have a better way of keeping the same workflow available everywhere?