2024-08-19



import 'package:flutter/material.dart';
import 'package:speech_to_text/speech_to_text.dart' as stt;
 
class VoiceMessageScreen extends StatefulWidget {
  @override
  _VoiceMessageScreenState createState() => _VoiceMessageScreenState();
}
 
class _VoiceMessageScreenState extends State<VoiceMessageScreen> {
  stt.SpeechToText speechToText = stt.SpeechToText();
  bool _isListening = false;
  String _speechText = '';
 
  @override
  void dispose() {
    super.dispose();
    speechToText.stopListening();
  }
 
  void _startListening() async {
    bool available = await speechToText.initialize();
    if (available) {
      setState(() => _isListening = true);
      speechToText.listen(onResult: (result) {
        setState(() => _speechText = result.recognizedWords);
      });
    }
  }
 
  void _stopListening() {
    speechToText.stopListening();
    setState(() => _isListening = false);
  }
 
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('语音消息'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(_speechText),
            SizedBox(height: 20.0),
            _isListening 
              ? IconButton(
                  icon: Icon(Icons.mic),
                  color: Colors.red,
                  onPressed: _stopListening,
                  iconSize: 48.0,
                )
              : IconButton(
                  icon: Icon(Icons.mic_none),
                  color: Colors.grey,
                  onPressed: _startListening,
                  iconSize: 48.0,
                ),
          ],
        ),
      ),
    );
  }
}

这段代码使用了speech_to_text插件,并展示了如何在Flutter应用中实现基本的语音识别功能。代码中包含了初始化、开始和停止监听语音的逻辑,并且在用户停止说话时更新UI显示识别的文本。在dispose方法中确保当Widget不再使用时停止监听,以避免资源泄露。

2024-08-19

在Flutter中,fluttertoast包提供了在应用中显示Toast消息的功能。以下是如何在Flutter项目中使用fluttertoast包的简单示例:

首先,在你的pubspec.yaml文件中添加fluttertoast包作为依赖:




dependencies:
  flutter:
    sdk: flutter
  fluttertoast: ^8.0.8

然后运行flutter pub get以安装依赖。

接下来,在你的Dart文件中,引入fluttertoast包并使用它来显示Toast:




import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
 
void main() => runApp(MyApp());
 
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Toast Example'),
        ),
        body: Center(
          child: RaisedButton(
            child: Text('Show Toast'),
            onPressed: () => showToast(),
          ),
        ),
      ),
    );
  }
 
  void showToast() {
    Fluttertoast.showToast(
      msg: "This is a Toast message",
      toastLength: Toast.LENGTH_SHORT,
      gravity: ToastGravity.BOTTOM,
      timeInSecForIosWeb: 1,
      backgroundColor: Colors.red,
      textColor: Colors.white,
      fontSize: 16.0
    );
  }
}

在这个例子中,当按钮被点击时,会触发showToast函数,在屏幕底部显示一个短暂的Toast消息。你可以根据需要调整Fluttertoast.showToast方法中的参数,如文本内容、显示时间长短、背景颜色、文本颜色等。

2024-08-19

在Flutter中,你可以创建一个使用NavigationRailBottomNavigationBar的应用,其中NavigationRail用于侧边导航,而BottomNavigationBar用于底部导航。以下是一个简单的示例代码:




import 'package:flutter/material.dart';
 
void main() => runApp(MyApp());
 
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}
 
class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}
 
class _HomePageState extends State<HomePage> {
  int _selectedIndex = 0;
 
  void _onItemTapped(int index) {
    setState(() {
      _selectedIndex = index;
    });
  }
 
  List<Widget> _buildPages() {
    return [
      Icon(Icons.home),
      Icon(Icons.favorite),
      Icon(Icons.shopping_cart),
      Icon(Icons.person),
    ];
  }
 
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: NavigationRail(
        selectedIndex: _selectedIndex,
        onDestinationSelected: _onItemTapped,
        leading: NavigationRailLogo(),
        destinations: [
          NavigationRailDestination(
            icon: Icon(Icons.home),
            label: Text('Home'),
          ),
          NavigationRailDestination(
            icon: Icon(Icons.favorite),
            label: Text('Favorites'),
          ),
          NavigationRailDestination(
            icon: Icon(Icons.shopping_cart),
            label: Text('Cart'),
          ),
          NavigationRailDestination(
            icon: Icon(Icons.person),
            label: Text('Profile'),
          ),
        ],
        body: const Text('Select a destination'),
      ),
      bottomNavigationBar: BottomNavigationBar(
        selectedItemColor: Colors.blue,
        unselectedItemColor: Colors.grey,
        selectedIconTheme: IconThemeData(size: 24),
        unselectedIconTheme: IconThemeData(size: 22),
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.home),
            label: 'Home',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.favorite),
            label: 'Favorites',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.shopping_cart),
            label: 'Cart',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.perso
2024-08-19



import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
 
class MyInAppWebViewPage extends StatefulWidget {
  @override
  _MyInAppWebViewPageState createState() => new _MyInAppWebViewPageState();
}
 
class _MyInAppWebViewPageState extends State<MyInAppWebViewPage> {
 
  InAppWebViewController webView;
  String url = FlutterInAppWebViewExampleRoutes.javascriptCallChannel;
 
  @override
  void initState() {
    super.initState();
  }
 
  @override
  void dispose() {
    super.dispose();
  }
 
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
            title: Text("InAppWebView")
        ),
        body: Container(
            child: Column(children: <Widget>[
              Expanded(
                  child: InAppWebView(
                    initialUrl: url,
                    initialHeaders: {},
                    initialOptions: InAppWebViewWidgetOptions(
                        inAppWebViewOptions: InAppWebViewOptions(
                            javaScriptEnabled: true,
                        )
                    ),
                    onWebViewCreated: (InAppWebViewController controller) {
                      webView = controller;
                    },
                    onLoadStart: (InAppWebViewController controller, String url) {
                    },
                    onLoadStop: (InAppWebViewController controller, String url) {
                      controller.evaluateJavascript(source: """
                        var button = document.getElementById('button');
                        button.addEventListener('click', function() {
                          callFlutterFunction('Hello, Flutter!');
                        });
                      """);
                    },
                  )
              ),
            ])
        )
    );
  }
}

这个代码实例展示了如何在Flutter应用中使用flutter_inappwebview插件来创建一个InAppWebView,并在WebView创建后,通过onLoadStop回调来注册一个JavaScript函数,该函数会监听页面上ID为button的元素的点击事件,并在点击发生时调用callFlutterFunction方法。这里的callFlutterFunction是一个JavaScript函数,它是由Flutter提供并由JavaScript调用,用于在Flutter端执行相关逻辑。

2024-08-19



import 'package:web_socket_channel/io.dart';
 
// 定义WebSocket连接的地址
const String serverUrl = 'ws://your-websocket-server-url';
 
// 创建WebSocket连接的通道
IOWebSocketChannel channel = IOWebSocketChannel.connect(Uri.parse(serverUrl));
 
// 监听服务器发送的消息
channel.stream.listen(
  (message) {
    print('收到服务器消息: $message');
  },
  onError: (error) {
    print('WebSocket出错: $error');
  },
  onDone: () {
    print('WebSocket连接已关闭');
  },
  cancelOnError: true,
);
 
// 发送消息到服务器
channel.sink.add('你好,服务器!');
 
// 关闭WebSocket连接
channel.sink.close();

这段代码展示了如何在Flutter中使用web_socket_channel包来创建和管理WebSocket连接。它包括连接到一个WebSocket服务器,监听消息,发送消息,处理错误和关闭连接。这是一个简洁且可以直接使用的WebSocket连接封装示例。

2024-08-19

Flutter的优点:

  1. 快速开发和热重载:Flutter提供了热重载功能,可以在几秒钟内对代码作出更改并查看结果,提高了开发效率。
  2. 一次编写处处运行:Flutter使用Dart语言,一次编写后的代码可以在Android和iOS以及其他平台运行,无需分别为不同平台编写代码。
  3. 自定义渲染:Flutter提供了自定义渲染路径,可以对渲染层进行深度定制和优化。
  4. 完整的SDK:Flutter提供了丰富的UI组件和API,可以快速构建高质量的应用程序。
  5. 开源:Flutter是开源的,开发者可以查看和修改其源代码。

Flutter的缺点:

  1. 学习曲线较陡峭:Flutter是一个全新的框架,需要学习新的开发方式和语言。
  2. 性能问题:虽然Flutter提供了热重载等功能,但在某些情况下,可能会影响应用程序的性能。
  3. 工具链配置复杂:配置Flutter开发环境需要一定的时间和精力。
  4. 生态系统支持不足:与原生平台的集成可能不完美,可能需要自己实现一些功能。
  5. 发布时间:新技术的发布可能会影响时间,导致学习和应用的时间成本。

代表作:

Flutter有很多代表作,例如Google的AdWords和Google AdSense,TikTok,Twitter,Slack,Shopify等都使用了Flutter进行应用开发。

2024-08-19



import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:wifi_info_flutter/wifi_info_flutter.dart';
 
void main() => runApp(MyApp());
 
class MyApp extends StatelessWidget {
  // 此处省略其他代码...
 
  // 获取WiFi信号强度
  Future<void> getWifiInfo() async {
    int info = await methodChannel.invokeMethod('getWifiInfo');
    setState(() {
      wifiInfo = info;
    });
  }
 
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('WiFi信号测量'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'WiFi信号强度:',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 10),
              Text(
                '$wifiInfo dBm',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 20),
              RaisedButton(
                child: Text('获取WiFi信号强度'),
                onPressed: getWifiInfo,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

这段代码示例展示了如何在Flutter应用中获取和显示WiFi信号强度。它使用了wifi_info_flutter插件,并通过MethodChannel与原生代码进行交互。用户点击按钮时,会触发获取WiFi信号强度的方法,并更新UI显示最新的信号强度。

2024-08-19



import 'package:flutter/material.dart';
import 'package:persistent_bottom_nav_bar/persistent_bottom_nav_bar.dart';
 
void main() {
  runApp(MyApp());
}
 
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}
 
class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text('Home Page'),
      ),
      bottomNavigationBar: PersistentTabView(
        context,
        controller: TabController(length: 3, vsync: Scrollable.of(context)!),
        items: [
          PersistentBottomNavBarItem(
            icon: Icon(Icons.home),
            title: "Home",
            activeColor: Colors.blue,
            inactiveColor: Colors.grey,
          ),
          PersistentBottomNavBarItem(
            icon: Icon(Icons.search),
            title: ("Search"),
            activeColor: Colors.blue,
            inactiveColor: Colors.grey,
          ),
          PersistentBottomNavBarItem(
            icon: Icon(Icons.settings),
            title: ("Settings"),
            activeColor: Colors.blue,
            inactiveColor: Colors.grey,
          ),
        ],
        onItemSelected: (int index) {},
        // configure the nav bar to show a shadow on the bottom
        showElevation: true,
        // choose the nav bar style
        selectedIndex: 0,
        // configure the nav bar background color
        // backgroundColor: Colors.blueGrey,
      ),
    );
  }
}

这段代码展示了如何在Flutter应用中使用persistent_bottom_nav_bar插件来创建一个持久的底部导航栏。我们创建了一个有三个标签的PersistentTabView,并为每个标签指定了图标和标题。我们还可以通过修改selectedIndex属性来控制哪个标签是选中的。此外,我们还可以通过showElevation属性来控制是否在底部导航栏显示阴影。

2024-08-19

在Flutter中,你可以使用Navigator来返回上一页,并且在上一页中清空编辑框的文本。以下是一个简单的例子:




import 'package:flutter/material.dart';
 
class MainScreen extends StatefulWidget {
  @override
  _MainScreenState createState() => _MainScreenState();
}
 
class _MainScreenState extends State<MainScreen> {
  final TextEditingController _controller = TextEditingController();
 
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextField(
              controller: _controller,
            ),
            RaisedButton(
              child: Text('Go to Details'),
              onPressed: () {
                Navigator.push(context, MaterialPageRoute(builder: (context) => DetailsScreen()));
              },
            ),
          ],
        ),
      ),
    );
  }
 
  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}
 
class DetailsScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Details Screen'),
        leading: IconButton(
          icon: Icon(Icons.arrow_back),
          onPressed: () {
            // 清空文本并返回上一页
            Navigator.of(context).pop();
            // 你也可以在这里通过其他方式清空文本,例如通过回调函数
          },
        ),
      ),
      body: Center(
        child: Text('This is the Details Screen'),
      ),
    );
  }
}
 
void main() {
  runApp(MaterialApp(home: MainScreen()));
}

在这个例子中,MainScreen是包含TextField的页面,当用户点击按钮跳转到DetailsScreen时,TextField的文本会被清空,因为我们在Navigator.push调用中没做任何处理。在DetailsScreen中,当用户点击返回箭头时,会通过Navigator.pop返回到上一页,并且TextField的文本会被清空。

2024-08-19

在Flutter中获取数据通常涉及到使用HTTP客户端从网络或其他数据源获取数据。以下是一个简单的例子,展示了如何在Flutter中获取网络数据:

  1. 添加必要的依赖项,在pubspec.yaml文件中:



dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.3 # 用于网络请求
  1. 导入所需的包:



import 'package:http/http.dart' as http;
  1. 使用http.get方法获取数据:



Future<String> fetchData() async {
  final response =
      await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));
 
  if (response.statusCode == 200) {
    // 如果请求成功,解析数据
    return response.body;
  } else {
    // 如果请求失败,抛出异常
    throw Exception('Failed to load post');
  }
}
  1. 在你的main.dart或其他widget中调用这个方法,并处理获取的数据:



void main() {
  runApp(MyApp());
}
 
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Fetch Data Example'),
        ),
        body: Center(
          child: FutureBuilder<String>(
            future: fetchData(),
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                return Text(snapshot.data);
              } else if (snapshot.hasError) {
                return Text("${snapshot.error}");
              }
 
              // 加载中的状态
              return CircularProgressIndicator();
            },
          ),
        ),
      ),
    );
  }
}

这个例子展示了如何在Flutter中异步获取网络数据,并在widget中显示。FutureBuilder是一个方便的widget,它可以处理异步计算并在不同的异步状态下显示不同的UI。在实际应用中,你可能需要对错误处理和数据解析进行更多的考虑,并且可能需要使用更复杂的HTTP客户端或状态管理库来管理状态。