flutter: 获取widget的变量类型。[variable]

问题描述 投票:0回答:1

我是颤振的新手,如果我的问题很基本,那么很抱歉。类

TelaDados
在类
TelaPrecos
内部调用,它有两个属性,其中之一是
numeroSerie

在类中

_TelaDados
我可以使用
numeroSerie
获取属性
widget.numeroSerie
的值。

当我单击按钮

Índice de preços
IPCA - var. mensal
时,会出现一个切换按钮。

我创建了一个名为

numeroSerie
的顶级变量,我想用
widget.numeroSerie
填充它。

仅当切换按钮切换到 1 (

numeroSerie
) 时,我才需要使用
Sim

我可以填写

numeroSerie
,因为我可以将其打印在屏幕上的切换按钮上方和 Android Studio 控制台中。但是当我尝试在名为
numeroSerie
getJsonFromRestAPI2
的顶级函数中打印
onStart
的值时,它会打印
null

我需要在此函数中使用该变量,以便放置后台服务(我将使用 API url 中的数字)并测试是否有必要生成本地通知以通知有来自API。

我看了很多网站,尝试了很多东西:

FutureBuilder
,将变量放入
initState
。这是我的代码(
print("onStart: $numeroSerie")
内部有一个
onStart
函数即将为空):

import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'dart:async';
import 'dart:convert';
import 'dart:ui';
import 'package:flutter_background_service/flutter_background_service.dart';
import 'package:flutter_background_service_android/flutter_background_service_android.dart';
import 'package:http/http.dart' as http;
import 'package:intl/intl.dart' hide TextDirection;
import 'package:toggle_switch/toggle_switch.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Permission.notification.isDenied.then(
        (value){
      if(value){
        Permission.notification.request();
      }
    },
  );

  runApp(MaterialApp(
    home: Home(),
    debugShowCheckedModeBanner: false,
  ));
}



class Home extends StatefulWidget {
  const Home({super.key});

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Escolha o assunto"),
      ),
      body: Container(
        child: Column(
          children: <Widget>[
            Padding(
              padding: EdgeInsets.all(10),
              child: Center(
                child: ElevatedButton(
                    style: ButtonStyle(
                        fixedSize: MaterialStateProperty.all(Size(200, 40))
                    ),
                    onPressed: (){
                      Navigator.push(
                          context,
                          MaterialPageRoute(
                              builder: (context) => TelaPrecos()
                          )
                      );
                    },
                    child: Text("Índices de preços")
                ),
              ),
            )
          ],
        ),
      ),
    );
  }
}

class TelaPrecos extends StatefulWidget {

  const TelaPrecos({super.key});
  @override
  State<TelaPrecos> createState() => _TelaPrecosState();
}

class _TelaPrecosState extends State<TelaPrecos> {
  bool _isLoading = false;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Índices de preços"),
      ),
      body: Container(
        child: Column(
          children: <Widget>[
            Padding(
              padding: EdgeInsets.all(10),
              child: Center(
                child: ElevatedButton(
                    style: ButtonStyle(
                        fixedSize: MaterialStateProperty.all(Size(200, 40))
                    ),
                    onPressed: (){
                      Navigator.push(
                          context,
                          MaterialPageRoute(
                              builder: (context) => TelaDados(numeroSerie: "433", nomeSerie: "IPCA - % mensal")
                          )
                      );
                    },
                    child: Text("IPCA - var. mensal")
                ),
              ),

            ),
          ],
        ),
      ),
    );
  }
}


class IPCA {
  final DateTime data;
  final double valor;

  IPCA(this.data, this.valor);
  factory IPCA.fromJson(Map<String, dynamic> parsedJson){
    return IPCA(
      DateFormat('MM/yyyy').parse(parsedJson['data'].substring(3)),
      double.parse(parsedJson['valor']),
    );
  }
}

class TelaDados extends StatefulWidget {
  //const TelaDados({super.key});
  final String numeroSerie;
  final String nomeSerie;
  TelaDados({required this.numeroSerie, required this.nomeSerie});
  @override
  State<TelaDados> createState() => _TelaDados();
}

var numeroSerie;
var service;

Future<void> initializeService() async {
  service = FlutterBackgroundService();
  await service.configure(iosConfiguration: IosConfiguration(
    autoStart: true,
    onForeground: onStart,
    onBackground: onIosBackground,
  ),
      androidConfiguration: AndroidConfiguration(
          onStart: onStart,
          isForegroundMode: true,
          autoStart: true
      )
  );
}

Future<String> getJsonFromRestAPI2() async {
  String url = "https://api.bcb.gov.br/dados/serie/bcdata.sgs.433/dados?formato=json";
  http.Response response = await http.get(Uri.parse(url));
  return response.body;
}

@pragma('vm:registry-point')
Future<bool> onIosBackground(ServiceInstance service) async {
  WidgetsFlutterBinding.ensureInitialized();
  DartPluginRegistrant.ensureInitialized();
  return true;
}

List<IPCA> listaBack = [];
var ultimaDataIPCA;
Future loadIPCAData2() async {
  String jsonString = await getJsonFromRestAPI2();
  final jsonResponse = json.decode(jsonString);
  for (Map<String, dynamic> i in jsonResponse){
    listaBack.add(IPCA.fromJson(i));
  }
  ultimaDataIPCA = listaBack.last.data;
}


@pragma('vm:registry-point')
void onStart(ServiceInstance service) {
  DartPluginRegistrant.ensureInitialized();
  if(service is AndroidServiceInstance){
    service.on("setAsForeground").listen((event) {
      service.setAsForegroundService();
    });
    service.on("setAsBackground").listen((event) {
      service.setAsBackgroundService();
    });
  }
  service.on("stopService").listen((event) {
    service.stopSelf();
  });

  Timer.periodic(const Duration(seconds: 1), (timer) async {
    if(service is AndroidServiceInstance){
      if(await service.isForegroundService()){
        service.setForegroundNotificationInfo(title: "SCRIPT ACADEMY", content: "sub my channel");
      }
    }
    // perfom some operation on background which is not noticeable to the user everytime
    //print("background service running");
    loadIPCAData2();
    print("background service running $ultimaDataIPCA");
    print("onStart: $numeroSerie");
  });

}

class _TelaDados extends State<TelaDados> {

  Future<String> getJsonFromRestAPI() async {
    //String url = "https://api.bcb.gov.br/dados/serie/bcdata.sgs.433/dados?formato=json";
    String url = "https://api.bcb.gov.br/dados/serie/bcdata.sgs.${widget.numeroSerie}/dados?formato=json";
    http.Response response = await http.get(Uri.parse(url));
    return response.body;
  }

  List<IPCA> chartData = [];

  DateTime startval1 = DateFormat('MM/yyyy').parse('01/2021');
  DateTime endval1 = DateFormat('MM/yyyy').parse('12/2021');

  TextEditingController dateInputEnd = TextEditingController();
  TextEditingController dateInputIni = TextEditingController();

  Future loadIPCAData() async {
    String jsonString = await getJsonFromRestAPI();
    final jsonResponse = json.decode(jsonString);
    setState(() {
      for (Map<String, dynamic> i in jsonResponse){
        chartData.add(IPCA.fromJson(i));
      }
      endval1 = chartData.last.data;
      startval1 = chartData[chartData.length-13].data;
    });
  }

  List<IPCA> itemsBetweenDates({
    required List<IPCA> lista,
    required DateTime start,
    required DateTime end,
  }) {
    var output = <IPCA>[];
    for (var i = 0; i < lista.length; i += 1) {
      DateTime date = lista[i].data;
      if (date.compareTo(start) >= 0 && date.compareTo(end) <= 0) {
        output.add(lista[i]);
      }
    }
    return output;
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    loadIPCAData();
    numeroSerie = widget.numeroSerie;
  }
  var initialIndex = 0;

  @override
  Widget build(BuildContext context) {

    filtrarDados(){

      dateInputIni.text = DateFormat('MM/yyyy').format(startval1).toString();
      dateInputEnd.text = DateFormat('MM/yyyy').format(endval1).toString();

      DateTime dataIni = DateFormat('MM/yyyy').parse(dateInputIni.text.toString());
      DateTime dataFim = DateFormat('MM/yyyy').parse(dateInputEnd.text.toString());

      late var lista_filtrada = itemsBetweenDates(lista: chartData, start: dataIni, end: dataFim);

      lista_filtrada.sort((a, b){ //sorting in descending order
        return a.data.compareTo(b.data);
      });
      return lista_filtrada;
    }

    return Scaffold(
        appBar: AppBar(
          title: Text("${widget.nomeSerie}"),
        ),
        body: SingleChildScrollView(
            child: Stack(
                children: <Widget>[
                  Container(
                      padding: EdgeInsets.all(40),
                      child: Column(
                        children: <Widget>[
                          ToggleSwitch(
                            initialLabelIndex: initialIndex,
                            totalSwitches: 2,
                            labels: [
                              'Não',
                              'Sim',
                            ],
                            onToggle: (index) async {
                              final service = FlutterBackgroundService();
                              if(index==1){
                                await initializeService();
                                service.startService();
                              } else {
                                service.invoke("stopService");
                              }
                              setState(() {
                                initialIndex = index!;
                              });
                            },
                          ),
                        ],
                      )
                  )
                ]
            )
        )
    );
  }
}

有任何建议欢迎提出!抱歉打扰了。

flutter service null background toggle
1个回答
0
投票

我解决了我的问题:
a) 我使用了库

shared_preferences
并将此代码放入
getJsonFromRestAPI
函数中以在本地保存
numeroSerie
:

final prefs = await SharedPreferences.getInstance();
await prefs.setString('numeroSerieSGS', widget.numeroSerie);

b)我创建了这个函数来读取保存的数据:

Future<String> getStringFromLocalStorage(String key) async {
  final prefs = await SharedPreferences.getInstance();
return prefs.getString(key) ?? '';
}

c) 在

onStart
函数中,我添加了以下代码来读取数据并将属性赋给变量
numeroSGS

String? numeroSGS = await getStringFromLocalStorage("numeroSerieSGS");
© www.soinside.com 2019 - 2024. All rights reserved.