简体   繁体   English

Flutter在间隔基础上设置floatactionbutton文本

[英]Flutter set floatingactionbutton text on interval basis

I have the following widget which will fit into a different parent widget into its body section. 我有以下窗口小部件,它将适合其主体部分的其他父窗口小部件。 So in the parent widget I call this widget as below body: MapsDemo(), . 因此,在父窗口小部件中,我将其称为body: MapsDemo(),如下body: MapsDemo(), The issue now is that at this section I run an interval where every 30 seconds I want to call api to get all the latest markers. 现在的问题是,在本节中,我每隔30秒运行一次间隔,我想每30秒调用一次api以获取所有最新标记。 Currently I print the count down as this codes print("${30 - timer.tick * 1}"); 目前,由于此代码print("${30 - timer.tick * 1}");我将计数打印下来print("${30 - timer.tick * 1}"); My issue is very simple I have 3 three floating action button and I have given them their id. 我的问题很简单,我有3个三个浮动操作按钮,并给了他们ID。 Thus on each count down for the last floatingaction button which is btn3.text I am trying to set its value as ${30 - timer.tick * 1} but it does not work on this basis. 因此,在最后一次浮动操作按钮btn3.text的每次递减计数中,我试图将其值设置为$ {30-timer.tick * 1},但在此基础上不起作用。 How can I update the count down in the button? 如何更新按钮中的倒数?

class MapsDemo extends StatefulWidget {
  @override
  State createState() => MapsDemoState();
}

class MapsDemoState extends State<MapsDemo> {
  GoogleMapController mapController;
  @override
    void initState() {
      super.initState();      
      startTimer(30);
    }

    startTimer(int index) async {

      print("Index30");
      print(index);
      new Timer.periodic(new Duration(seconds: 1), (timer) {
        if ((30 / 1) >= timer.tick) {
          print("${30 - timer.tick * 1}");
          btn3.text = ${30 - timer.tick * 1};
        } else {
          timer.cancel();
          var responseJson = NetworkUtils.getAllMarkers(
                   authToken
               );
          mapController.clearMarkers();
          //startTimer(index + 1);
        }
      });

  }

 //Map<PermissionGroup, PermissionStatus> permissions = await PermissionHandler().requestPermissions([PermissionGroup.contacts]);import 'package:permission_handler/permission_handler.dart';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
          body: Stack(
            children: <Widget>[

              GoogleMap(
                  onMapCreated: (GoogleMapController controller) {
                   mapController = controller;

                 },
                initialCameraPosition: new CameraPosition(target: LatLng(3.326411697920109, 102.13127606037108))
                ),
                Padding(
                  padding: const EdgeInsets.all(16.0),
                  child: Align(
                    alignment: Alignment.topRight,
                    child: Column(
                    children: <Widget>[  
                     FloatingActionButton(
                      onPressed: () => print('button pressed'),
                      materialTapTargetSize: MaterialTapTargetSize.padded,
                      backgroundColor: Colors.lightBlue,
                      child: const Icon(Icons.map, size: 30.0),
                      heroTag: "btn1",

                     ),
                    SizedBox(height: 5.0),
                    FloatingActionButton(
                        onPressed: () => print('second  pressed'),
                        materialTapTargetSize: MaterialTapTargetSize.padded,
                        backgroundColor: Colors.lightBlue,
                        child: const Icon(Icons.add, size: 28.0),
                        heroTag: "btn2",
                      ),
                      SizedBox(height: 5.0),
                      FloatingActionButton(
                        onPressed: () => print('second  pressed'),
                        materialTapTargetSize: MaterialTapTargetSize.padded,
                        backgroundColor: Colors.lightBlue,
                        child: const Icon(Icons.directions_bike, size: 28.0),
                        heroTag: "btn3",

                      ),
                    ]
                  )
                  ),
                ),
            ]

         )
    );
  }
}

The below will display a countdown from 30 seconds inside of a FloatingActionButton . 下面将在FloatingActionButton内部显示从30秒开始的倒计时。

import 'dart:async';

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'FAB Countdown Demo',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  static const _defaultSeconds = 30;
  Timer _timer;
  var _countdownSeconds = 0;

  @override
  void initState() {
    _timer = Timer.periodic(Duration(seconds: 1), (Timer t) => _getTime());
    super.initState();
  }

  @override
  void dispose() {
    _timer.cancel();
    super.dispose();
  }

  void _getTime() {
    setState(() {
      if (_countdownSeconds == 0) {
        _countdownSeconds = _defaultSeconds;
      } else {
        _countdownSeconds--;
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomPadding: false,
      appBar: AppBar(
        title: const Text('FAB Countdown Demo'),
      ),
      floatingActionButton: FloatingActionButton(
          child: Text('$_countdownSeconds'), onPressed: () {}),
    );
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM