Italian Chiacchiericci

Filippo

Expert
Licensed User
Longtime User
Ciao a tutti,

sto cercando di imparare un nuovo(per me) linguaggio: Flutter & Dart.
Ho creato la mia prima applicazione guardando un video YouTube di un bravo insegnante.
A mio parere, questo linguaggio è l'unico che si possa davvero definire “Cross platform”.
Questa applicazione con tre schermate (oggi, ieri e l'altro ieri) è composta da 149 righe e funziona senza bisogno di modifiche su Android e iPhone e non solo.
Per uno come me, che viene da Visual-Basic, è un linguaggio difficile da capire, però ho voglia di imparere qualche cosa di nuovo.
C'è qualcuno che si è già avvicinato a questo linguaggio?

(Spero che il "capo" non cancelli questo post.) ;)

1756294087744.png

1756294095344.png

1756294101326.png


B4X:
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() {
  runApp(const MyApp());
}

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

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
        scaffoldBackgroundColor: Color(0xff292929),
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  final controller  = PageController(initialPage: 0);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: PageView(
        controller: controller,
        children: const[
        DetailPage(headline: "Heute", daysInPast: 0),
        DetailPage(headline: "Gestern", daysInPast: 1),
        DetailPage(headline: "Vorgestern", daysInPast: 2)
        ],
      ) ,
    );
  }
}

class DetailPage extends StatefulWidget {
  const DetailPage({super.key, required this.headline, required this.daysInPast});

  final String headline;
  final int daysInPast;

  @override
  State<DetailPage> createState() => _DetailPageState();
}

class _DetailPageState extends State<DetailPage> {
  @override
  Widget build(BuildContext context) {
    return Padding(
        padding: EdgeInsetsDirectional.fromSTEB(0, 48, 0, 32),
        child: Column(children: [
          Text(widget.headline, style: const TextStyle(fontSize: 48.0, color: Colors.white)),
          TrackingElement(color: const Color(0xFFECC94E), iconData: Icons.directions_run, unit: 'm', max: 5000, daysInPast: widget.daysInPast),
          TrackingElement(color: const Color(0xFF9AFF3B), iconData: Icons.local_drink, unit: "ml" , max: 3000, daysInPast: widget.daysInPast),
          TrackingElement(color: const Color(0xFFEC2D2D), iconData: Icons.fastfood_sharp, unit: "kcal", max: 1680, daysInPast: widget.daysInPast),
        ],)
    );
  }
}

class TrackingElement extends StatefulWidget {
  const TrackingElement({super.key, required this.color, required this.iconData, required this.unit, required this.max, required this.daysInPast});
  final Color color;
  final IconData iconData;
  final String unit;
  final double max ;
  final int daysInPast;

  @override
  _TrackingElementState createState() => _TrackingElementState();
}

class _TrackingElementState extends State<TrackingElement> {
  final Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
  int _counter = 0;
  double _progress = 0;
  var now = DateTime.now();
  String _StorageKey= '';

  Future<void> _incrementCounter() async {
    setState(() {
      _counter += 200;
      _progress = _counter / widget.max;
    });
    (await _prefs).setInt(_StorageKey, _counter);
  }

  @override
  void initState() {
    super.initState();

    _StorageKey = '${now.year} -${now.month}-${now.day - widget.daysInPast}_${widget.unit}';
  }

  @override
  void didChangeDependencies(){
    super.didChangeDependencies();
    _prefs.then((prefs) {
      setState(() {
        _counter = prefs.getInt(_StorageKey) ?? 0;
        _progress = _counter / widget.max;
      });
     });
  }

  @override
  Widget build(BuildContext context) {

    return InkWell(
      onTap: _incrementCounter,
      child: Column(
      children: <Widget>[
        Padding(
            padding: const EdgeInsetsDirectional.fromSTEB(32, 64, 32, 24),
            child: Row(children: <Widget>[
              Icon(widget.iconData, color: Colors.white70, size: 50),
              Text(
                '$_counter / ${widget.max.toInt()} ${widget.unit}',

                style: const TextStyle(color: Colors.white70, fontSize: 32),
              ),
            ],)
        ),
        LinearProgressIndicator(
          value: _progress,
          color: widget.color,
          backgroundColor: const Color(0x40FFFFFF),
          minHeight: 12.0,
        )
      ],
    ),);
  }
}
 

LucaMs

Expert
Licensed User
Longtime User
sto cercando di imparare un nuovo(per me) linguaggio: Flutter & Dart.
Pensiamoci "un attimo"; vale la pena imparare altri linguaggi (e framework e NON IDE, visto che non ce ne sono)?

Sì, se sei ancora un adolescente e speri che un giorno riuscirai a fare il programmatore dipendente rischiando crisi di nervi per stipendi di 800€/mese in nero.

Se vuoi pubblicare app o comunque sviluppare in proprio, per terzi, non sarà meglio essere già molto pratico di strumenti che già conosci bene?

Detto questo, se proprio dovessi imparare un linguaggio "nuovo", studierei Python e non solo perché sappiamo quanto Google sia affidabile, quanto poco spesso cambi i propri servizi, API, etc.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Ich penso che finché si è vivi, vale sempre la pena imparare cose nuove.
Du 😄, io no, per vari motivi. Il primo, personale, è che temo di avere pessima memoria, quindi se non utilizzo "quel" linguaggio spesso, me lo dimentico.
Altri motivi: non abbiamo la memoria illimitata e Il tempo è una delle cose più importanti, spenderlo per imparare qualcosa che poi metti nel cassetto è uno spreco.

Come IDE si può usare Android-Studio oppure Visual-Studio-Code, e questo con Windows e MacOS.
Eh, chiamali IDE, ma in realtà VSC altro non è che un editor di testi. AS ha un designer, ma utilizzabile con linguaggi diversi da Java? Boh.
 

Elric

Well-Known Member
Licensed User
Imparare sempre cose nuove è molto bello... ogni giorno (che mi collego al forum) ne imparo una su B4X!

Cambio un attimo discorso, giusto per raccontarvi cosa ho fatto dopo cena.

Nel 2017 ho comprato un portatile HP. Nel dicembre 2021 ho dovuto cambiare la batteria perché ormai non reggeva più. Sorvolo sul tempo impiegato ad aprirlo (e a imprecare). Ci ho trovato dentro la batteria originale non gonfia. Di originali pare non se ne trovassero più. Quindi, ho ripiegato su un sito di "l'impero delle batterie" che mi ha fornito "celle verdi".

Questa estate (dopo quasi quattro anni) è completamente morta. Mi sono deciso a prenderne una da "batterie Italia" e stasera ho provveduto a imprecare nuovamente per aprire il portatile, con una difficoltà che non ricordavo. All'apparenza il portatile e la cover avevano le loro classiche dimensioni ma la cover era particolarmente "resistente" (o resiliente, se volete, va molto di moda oggi) e non ne voleva sapere di aprirsi anche se avevo sbloccato un intero lato lungo e buona parte dei lati corti.

Alla fine ce l'ho fatta!

Ed ecco che mi trovo di fronte una batteria con la prima a sinistra delle quattro celle eccezionalmente gonfia! Con cautela mi son detto, svitiamola, ma senza essere troppo precipitosi. Altra difficoltà: era talmente gonfia che non riuscivo a svitare la batteria!

Di positivo c'è che la vecchia batteria non è scoppiata, non ha preso fuoco, non ha esalato gas e l'operazione di sostituzione è andata a buon fine (altrimenti non starei qui a scrivere: nella migliore delle ipotesi sarei nel mio letto, al buio, guardando il soffitto e pensando a come recuperare il tutto; nella peggiore sarei sempre a letto ma non in quello mio!) e che dopo un'oretta la nuova batteria pare tenere. Quindi, stanotte potrò rimanere nel mio letto a guardare il soffitto e chiedermi se jules.google possa essermi di qualche aiuto per B4X.

Di meno positivo c'è che domani dovrò aspettare che la discarica apra per liberarmene il prima possibile, farò tardi a lavoro e, di conseguenza, tornerò a casa tardi.

Sperando che stanotte faccia la brava...!
 

LucaMs

Expert
Licensed User
Longtime User
Spero di non portarmi sfiga ma... il mio portatile, pesantissimo sia per l'età, sia per il display da 17", campa ancora dopo ben 16 anni (2009).
A quanto pare, almeno in questo caso non c'era la "obsolescenza programmata" (rottura programmata).
Non so quelli di oggi, ma questo è un Samsung, che all'epoca non era certo noto per i PC, anzi affatto.
 

Filippo

Expert
Licensed User
Longtime User
AS ha un designer, ma utilizzabile con linguaggi diversi da Java? Boh.
Certo che si può utilizzare con Dart, anche se per Dart non bisogna veramente un designer.
Tutto quello che crei o aggiorni nel code, lo vedi sul dispositivo reale o su un simulator in temp reale, senza bisogno di compilare nuovamente.
Guarda questo video, è in tedesco, ma penso che si possa trovare anche in italiano.
 

LucaMs

Expert
Licensed User
Longtime User
Scherzi a parte, gli mancano alcune cosette:

1. l'Undo ce l'ha, ma sarebbe utile anche un Redo;
2. la possibilità di tagliare la figura
3. farne una custom view, così da poterne avere più di una su un'unica schermata

Fatto questo, troverò un cestino in cui buttarla 😄
 
Top