Flutter: ошибка присвоения переменных Safe nulled

С 3 версии Flatter, если вам нужна переменная которая может быть null, то это нужно объявить явно при помощи оператора ?:

double?latitude;

Возникает смесь, переменными, которые объявлены традиционно вида:

double aaa=10.0;

И если далее в программе мы захотим присвоить значение одной переменной другой:

aaa=latitude;

Мы получим ошибку вида:

dart A value of type 'double?' can't be assigned to a variable of type 'double' because 'double?' is nullable and 'double' isn't

Как избежать? Достаточно при присвоении использовать оператор ??, при помощи которого можно назначить значение «по умолчанию» для null:

aa=latitude??0;

Flutter: обновление виджета одного класса из другого класса

Задача: в одном из фоново работающих классов (WebSocket клиент) изменилось значение отображаемое в другом классе. Необходимо вызвать setState для изменившегося виджета

Решение: воспользуемся классом StreamController. По сути это «конвеер», в который можно что-то ложить и объявлять «слушателя», который будет что-то делать если в «конвеер» попадет какое-либо значение.

Объявим в глобальных переменных контроллер, «конвеера»:

library me_flutter.globals;
var sup_controller = new StreamController<String>.broadcast();

Далее в классе ИЗ которого нужно сообщить что что-то изменилось, ложим в «конвеер» данные:

globals.sup_controller.add("new_message");

А в классе, который должен отображать изменения, объявим «слушателя» в initState:

class Support extends StatefulWidget {
  @override
  _SupportState createState() => _SupportState();
}
class _SupportState extends State<Support> {
  StreamSubscription?subscription;
  @override
  void initState() {
    super.initState();
    print("-оформляем подписку..");
      subscription = globals.sup_controller.stream.listen((index) {
        print("чтото пришло!");
        setState(() {
          _scrollDown();
        });
      });
....

Не забудем при выходе из класса, убить подписку:

  @override
  void dispose() {
    print("--отменил подписку..");
    subscription?.cancel();
    super.dispose();
  }

Flutter: периодический таймер

Во Flutter за таймеры отвечает класс Timer, а за периодический в частности Timer.periodic

Для примера использования, реализуем отчет переменной от 30 до 0:

import 'dart:async';
Timer?_timer; // ? говорит о том, что переменная в начале пути может быть null
int timercount=30;
bool timout_passed=false; //вышел таймаут разблокировки кнопки
...
_timer = Timer.periodic(Duration(seconds: 1), (Timer _) {
 if (timercount>0) {
    timercount = timercount - 1;
 };
 if (timercount==0) {
   timout_passed=true;
   _timer?.cancel();  // закончили отчёт
 }
});

Flutter: чтение файла из ресурсов

Это возможно при использовании класса rootBundle. Для начала необходимо разместить файл в папку проекта. Далее в pubspec.yaml в секцию assets добавить ссылку на файл вида:

  assets:    
    - lib/files/user_agreement.txt

И далее в коде оформить загрузку файла:

import 'package:flutter/services.dart' show rootBundle;
...
class _LoginState extends State<Login> {
   String agreement_txt="";
...
   Future<void> loadAgreement() async {
     final loadAgreement = await rootBundle.loadString('lib/files/user_agreement.txt');
     setState(() {
       agreement_txt = loadAgreement;
     });
   }
...
@override
  void initState() {
     super.initState();
     loadAgreement();
  }
...
dia.SureDialog(context, "Политика конфиденциальности", agreement_txt, () {}, () {});

Flutter: как убрать полоски при выходе за рамки контейнера виджета?

Чаще всего такие полоски появляются при появлении экранной клавиатуры в поле ввода или при выходе элементов виджета за видимые поля, например текста. Избежать этого, можно обернув большой виджет в виджет SingleChildScrollView:

SingleChildScrollView(
  child:Container(
...
  )
)

В результате получится намного приятнее:

1 53 54 55 56 57 310